ZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3RkdHlwZXMudGV4IGIvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXgKaW5kZXggN2M1Y2JhMC4uYzM5YmUyOCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXgKKysrIGIvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXgKQEAgLTEyNjYsOSArMTI2Niw5IEBACiAgICAgICAgICAge2EgY29weSBvZiBcdmFye2F9J3MgbGlzdCBvZiAoXHZhcntrZXl9LCBcdmFye3ZhbHVlfSkgcGFpcnN9CiAgICAgICAgICAgeygzKX0KICAgXGxpbmVpaWl7XHZhcnthfS5rZXlzKCl9e2EgY29weSBvZiBcdmFye2F9J3MgbGlzdCBvZiBrZXlzfXsoMyl9Ci0gIFxsaW5laWlpe1x2YXJ7YX0udXBkYXRlKFx2YXJ7Yn0pfQotICAgICAgICAgIHtcY29kZXtmb3IgXHZhcntrfSBpbiBcdmFye2J9LmtleXMoKTogXHZhcnthfVtcdmFye2t9XSA9IFx2YXJ7Yn1bXHZhcntrfV19fQotICAgICAgICAgIHt9CisgIFxsaW5laWlpe1x2YXJ7YX0udXBkYXRlKFxvcHRpb25hbHtcdmFye2J9fSl9CisgICAgICAgICAge3VwZGF0ZXMgKGFuZCBvdmVyd3JpdGVzKSBrZXkvdmFsdWUgcGFpcnMgZnJvbSBcdmFye2J9fQorICAgICAgICAgIHsoOSl9CiAgIFxsaW5laWlpe1x2YXJ7YX0uZnJvbWtleXMoXHZhcntzZXF9XG9wdGlvbmFseywgXHZhcnt2YWx1ZX19KX0KICAgICAgICAgICB7Q3JlYXRlcyBhIG5ldyBkaWN0aW9uYXJ5IHdpdGgga2V5cyBmcm9tIFx2YXJ7c2VxfSBhbmQgdmFsdWVzIHNldCB0byBcdmFye3ZhbHVlfX0KICAgICAgICAgICB7KDcpfQkJCSAgIApAQCAtMTMzOCw2ICsxMzM4LDEzIEBACiB2YWx1ZSBpcyBnaXZlbiBhbmQgdGhlIGtleSBpcyBub3QgZm91bmQuICBcdmVyc2lvbmFkZGVkezIuM30KIFxlbmR7ZGVzY3JpcHRpb259CiAKK1xpdGVtWyg5KV0gXGZ1bmN0aW9ue3VwZGF0ZSgpfSBhY2NlcHRzIGVpdGhlciBhbm90aGVyIG1hcHBpbmcgb2JqZWN0CitvciBhbiBpdGVyYWJsZSBvZiBrZXkvdmFsdWUgcGFpcnMgKGFzIGEgdHVwbGUgb3Igb3RoZXIgaXRlcmFibGUgb2YKK2xlbmd0aCB0d28pLiAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCwgdGhlIG1hcHBpbmcgaXMKK3RoZW4gaXMgdXBkYXRlZCB3aXRoIHRob3NlIGtleS92YWx1ZSBwYWlyczoKK1xzYW1we2QudXBkYXRlKHJlZD0xLCBibHVlPTIpfS4KK1x2ZXJzaW9uY2hhbmdlZFtBbGxvd2VkIHRoZSBhcmd1bWVudCB0byBiZSBhbiBpdGVyYWJsZSBvZiBrZXkvdmFsdWUKKyAgICAgICAgICAgICAgICBwYWlycyBhbmQgYWxsb3dlZCBrZXl3b3JkIGFyZ3VtZW50c117Mi40fQogCiBcc3Vic2VjdGlvbntGaWxlIE9iamVjdHMKICAgICAgICAgICAgIFxsYWJlbHtibHRpbi1maWxlLW9iamVjdHN9fQpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjQudGV4IGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjQudGV4CmluZGV4IGViMzc3YmUuLjI0NjUwZmEgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy93aGF0c25ldzI0LnRleAorKysgYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNC50ZXgKQEAgLTEzNCw2ICsxMzQsMTAgQEAKIAogXGJlZ2lue2l0ZW1pemV9CiAKK1xpdGVtIFRoZSBcbWV0aG9ke2RpY3QudXBkYXRlKCl9IG1ldGhvZCBub3cgYWNjZXB0cyB0aGUgc2FtZQorYXJndW1lbnQgZm9ybXMgYXMgdGhlIFxjbGFzc3tkaWN0fSBjb25zdHJ1Y3Rvci4gIFRoaXMgaW5jbHVkZXMgYW55CittYXBwaW5nLCBhbnkgaXRlcmFibGUgb2Yga2V5L3ZhbHVlIHBhaXJzLCBhbmQvb3Iga2V5d29yZCBhcmd1bWVudHMuICAgICAgIAorCiBcaXRlbSBUaGUgc3RyaW5nIG1ldGhvZHMsIFxtZXRob2R7bGp1c3QoKX0sIFxtZXRob2R7cmp1c3QoKX0sIGFuZAogXG1ldGhvZHtjZW50ZXIoKX0gbm93IHRha2UgYW4gb3B0aW9uYWwgYXJndW1lbnQgZm9yIHNwZWNpZnlpbmcgYQogZmlsbCBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBhIHNwYWNlLgpkaWZmIC0tZ2l0IGEvTGliL1VzZXJEaWN0LnB5IGIvTGliL1VzZXJEaWN0LnB5CmluZGV4IDgxNDFlN2YuLjg3Y2M2YTMgMTAwNjQ0Ci0tLSBhL0xpYi9Vc2VyRGljdC5weQorKysgYi9MaWIvVXNlckRpY3QucHkKQEAgLTQsOCArNCw2IEBACiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpY3Q9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgICBzZWxmLmRhdGEgPSB7fQogICAgICAgICBpZiBkaWN0IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoZGljdCwna2V5cycpOgotICAgICAgICAgICAgICAgIGRpY3QgPSB0eXBlKHt9KShkaWN0KSAgICMgbWFrZSBtYXBwaW5nIGZyb20gYSBzZXF1ZW5jZQogICAgICAgICAgICAgc2VsZi51cGRhdGUoZGljdCkKICAgICAgICAgaWYgbGVuKGt3YXJncyk6CiAgICAgICAgICAgICBzZWxmLnVwZGF0ZShrd2FyZ3MpCkBAIC0zOSwxNCArMzcsMTggQEAKICAgICBkZWYgaXRlcnZhbHVlcyhzZWxmKTogcmV0dXJuIHNlbGYuZGF0YS5pdGVydmFsdWVzKCkKICAgICBkZWYgdmFsdWVzKHNlbGYpOiByZXR1cm4gc2VsZi5kYXRhLnZhbHVlcygpCiAgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KTogcmV0dXJuIHNlbGYuZGF0YS5oYXNfa2V5KGtleSkKLSAgICBkZWYgdXBkYXRlKHNlbGYsIGRpY3QpOgotICAgICAgICBpZiBpc2luc3RhbmNlKGRpY3QsIFVzZXJEaWN0KToKKyAgICBkZWYgdXBkYXRlKHNlbGYsIGRpY3Q9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICBpZiBkaWN0IGlzIE5vbmU6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShkaWN0LCBVc2VyRGljdCk6CiAgICAgICAgICAgICBzZWxmLmRhdGEudXBkYXRlKGRpY3QuZGF0YSkKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKGRpY3QsIHR5cGUoc2VsZi5kYXRhKSk6CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShkaWN0LCB0eXBlKHt9KSkgb3Igbm90IGhhc2F0dHIoZGljdCwgJ2l0ZW1zJyk6CiAgICAgICAgICAgICBzZWxmLmRhdGEudXBkYXRlKGRpY3QpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBmb3IgaywgdiBpbiBkaWN0Lml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgc2VsZltrXSA9IHYKKyAgICAgICAgaWYgbGVuKGt3YXJncyk6CisgICAgICAgICAgICBzZWxmLmRhdGEudXBkYXRlKGt3YXJncykKICAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZmFpbG9iaj1Ob25lKToKICAgICAgICAgaWYgbm90IHNlbGYuaGFzX2tleShrZXkpOgogICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKQEAgLTEzNiwxNyArMTM4LDIxIEBACiAgICAgICAgICAgICByYWlzZSBLZXlFcnJvciwgJ2NvbnRhaW5lciBpcyBlbXB0eScKICAgICAgICAgZGVsIHNlbGZba10KICAgICAgICAgcmV0dXJuIChrLCB2KQotICAgIGRlZiB1cGRhdGUoc2VsZiwgb3RoZXIpOgorICAgIGRlZiB1cGRhdGUoc2VsZiwgb3RoZXI9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgICAjIE1ha2UgcHJvZ3Jlc3NpdmVseSB3ZWFrZXIgYXNzdW1wdGlvbnMgYWJvdXQgIm90aGVyIgotICAgICAgICBpZiBoYXNhdHRyKG90aGVyLCAnaXRlcml0ZW1zJyk6ICAjIGl0ZXJpdGVtcyBzYXZlcyBtZW1vcnkgYW5kIGxvb2t1cHMKKyAgICAgICAgaWYgb3RoZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCAnaXRlcml0ZW1zJyk6ICAjIGl0ZXJpdGVtcyBzYXZlcyBtZW1vcnkgYW5kIGxvb2t1cHMKICAgICAgICAgICAgIGZvciBrLCB2IGluIG90aGVyLml0ZXJpdGVtcygpOgogICAgICAgICAgICAgICAgIHNlbGZba10gPSB2Ci0gICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgJ19faXRlcl9fJyk6ICMgaXRlciBzYXZlcyBtZW1vcnkKLSAgICAgICAgICAgIGZvciBrIGluIG90aGVyOgotICAgICAgICAgICAgICAgIHNlbGZba10gPSBvdGhlcltrXQotICAgICAgICBlbHNlOgorICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsICdrZXlzJyk6CiAgICAgICAgICAgICBmb3IgayBpbiBvdGhlci5rZXlzKCk6CiAgICAgICAgICAgICAgICAgc2VsZltrXSA9IG90aGVyW2tdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgaywgdiBpbiBvdGhlcjoKKyAgICAgICAgICAgICAgICBzZWxmW2tdID0gdgorICAgICAgICBpZiBrd2FyZ3M6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZShrd2FyZ3MpCiAgICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJldHVybiBzZWxmW2tleV0KZGlmZiAtLWdpdCBhL0xpYi9vcy5weSBiL0xpYi9vcy5weQppbmRleCA4Y2VjOTEyLi5mZGI5YTQ2IDEwMDY0NAotLS0gYS9MaWIvb3MucHkKKysrIGIvTGliL29zLnB5CkBAIC00MzMsOSArNDMzLDYgQEAKICAgICAgICAgICAgICAgICByZXR1cm4ga2V5LnVwcGVyKCkgaW4gc2VsZi5kYXRhCiAgICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZmFpbG9iaj1Ob25lKToKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhLmdldChrZXkudXBwZXIoKSwgZmFpbG9iaikKLSAgICAgICAgICAgIGRlZiB1cGRhdGUoc2VsZiwgZGljdCk6Ci0gICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gZGljdC5pdGVtcygpOgotICAgICAgICAgICAgICAgICAgICBzZWxmW2tdID0gdgogICAgICAgICAgICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGRpY3Qoc2VsZikKIApAQCAtNDQ3LDkgKzQ0NCw2IEBACiAgICAgICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCBpdGVtKToKICAgICAgICAgICAgICAgICBwdXRlbnYoa2V5LCBpdGVtKQogICAgICAgICAgICAgICAgIHNlbGYuZGF0YVtrZXldID0gaXRlbQotICAgICAgICAgICAgZGVmIHVwZGF0ZShzZWxmLCBkaWN0KToKLSAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBkaWN0Lml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGZba10gPSB2CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgdW5zZXRlbnYKICAgICAgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NhbGwucHkgYi9MaWIvdGVzdC90ZXN0X2NhbGwucHkKaW5kZXggOTk1NTRjNy4uZjNjN2M4YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jYWxsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2FsbC5weQpAQCAtODYsNDEgKzg2LDQxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwge30ua2V5cywgeD0yLCB5PTIpCiAKICAgICBkZWYgdGVzdF9vbGRhcmdzMV8wKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHt9LnVwZGF0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBbXS5jb3VudCkKIAogICAgIGRlZiB0ZXN0X29sZGFyZ3MxXzEoc2VsZik6Ci0gICAgICAgIHt9LnVwZGF0ZSh7fSkKKyAgICAgICAgW10uY291bnQoMSkKIAogICAgIGRlZiB0ZXN0X29sZGFyZ3MxXzIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwge30udXBkYXRlLCB7fSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBbXS5jb3VudCwgMSwgMikKIAogICAgIGRlZiB0ZXN0X29sZGFyZ3MxXzBfZXh0KHNlbGYpOgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICB7fS51cGRhdGUoKigpKQorICAgICAgICAgICAgW10uY291bnQoKigpKQogICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCiAKICAgICBkZWYgdGVzdF9vbGRhcmdzMV8xX2V4dChzZWxmKToKLSAgICAgICAge30udXBkYXRlKCooe30sKSkKKyAgICAgICAgW10uY291bnQoKigxLCkpCiAKICAgICBkZWYgdGVzdF9vbGRhcmdzMV8yX2V4dChzZWxmKToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAge30udXBkYXRlKCooe30sIDIpKQorICAgICAgICAgICAgW10uY291bnQoKigxLCAyKSkKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgogCiAgICAgZGVmIHRlc3Rfb2xkYXJnczFfMF9rdyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB7fS51cGRhdGUsIHg9MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBbXS5jb3VudCwgeD0yKQogCiAgICAgZGVmIHRlc3Rfb2xkYXJnczFfMV9rdyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB7fS51cGRhdGUsIHt9LCB4PTIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgW10uY291bnQsIHt9LCB4PTIpCiAKICAgICBkZWYgdGVzdF9vbGRhcmdzMV8yX2t3KHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHt9LnVwZGF0ZSwgeD0yLCB5PTIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgW10uY291bnQsIHg9MiwgeT0yKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X3R5cGVzLnB5CmluZGV4IGFhOGY4NTQuLjRiNGUxOWMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90eXBlcy5weQpAQCAtMjUzLDcgKzI1Myw3IEBACiBpZiBkICE9IHsxOjEsIDI6MiwgMzozfTogcmFpc2UgVGVzdEZhaWxlZCwgJ2RpY3QgdXBkYXRlJwogZC5jbGVhcigpCiB0cnk6IGQudXBkYXRlKE5vbmUpCi1leGNlcHQgQXR0cmlidXRlRXJyb3I6IHBhc3MKK2V4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6IHBhc3MKIGVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICdkaWN0LnVwZGF0ZShOb25lKSwgQXR0cmlidXRlRXJyb3IgZXhwZWN0ZWQnCiBjbGFzcyBTaW1wbGVVc2VyRGljdDoKICAgICBkZWYgX19pbml0X18oc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5IGIvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weQppbmRleCA2MDJmZDkwLi4wZWQ0MzY5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkKQEAgLTkzLDggKzkzLDEyIEBACiAgICAgICAgICN1cGRhdGUKICAgICAgICAgcC51cGRhdGUoc2VsZi5yZWZlcmVuY2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdChwKSwgc2VsZi5yZWZlcmVuY2UpCisgICAgICAgIGl0ZW1zID0gcC5pdGVtcygpCisgICAgICAgIHAgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgcC51cGRhdGUoaXRlbXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdChwKSwgc2VsZi5yZWZlcmVuY2UpCiAgICAgICAgIGQgPSBzZWxmLl9mdWxsX21hcHBpbmcoc2VsZi5yZWZlcmVuY2UpCi0gICAgICAgICNzZXRkZWZhdWxsdAorICAgICAgICAjc2V0ZGVmYXVsdAogICAgICAgICBrZXksIHZhbHVlID0gZC5pdGVyaXRlbXMoKS5uZXh0KCkKICAgICAgICAga25vd25rZXksIGtub3dudmFsdWUgPSBzZWxmLm90aGVyLml0ZXJpdGVtcygpLm5leHQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuc2V0ZGVmYXVsdChrZXksIGtub3dudmFsdWUpLCB2YWx1ZSkKZGlmZiAtLWdpdCBhL0xpYi93ZWFrcmVmLnB5IGIvTGliL3dlYWtyZWYucHkKaW5kZXggMDliZWQ2NS4uNWM2NjE4NiAxMDA2NDQKLS0tIGEvTGliL3dlYWtyZWYucHkKKysrIGIvTGliL3dlYWtyZWYucHkKQEAgLTEyMiwxMCArMTIyLDE1IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gd3IoKQogCi0gICAgZGVmIHVwZGF0ZShzZWxmLCBkaWN0KToKKyAgICBkZWYgdXBkYXRlKHNlbGYsIGRpY3Q9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgICBkID0gc2VsZi5kYXRhCi0gICAgICAgIGZvciBrZXksIG8gaW4gZGljdC5pdGVtcygpOgotICAgICAgICAgICAgZFtrZXldID0gcmVmKG8sIHNlbGYuX19tYWtlcmVtb3ZlKGtleSkpCisgICAgICAgIGlmIGRpY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihkaWN0LCAiaXRlbXMiKToKKyAgICAgICAgICAgICAgICBkaWN0ID0gdHlwZSh7fSkoZGljdCkKKyAgICAgICAgICAgIGZvciBrZXksIG8gaW4gZGljdC5pdGVtcygpOgorICAgICAgICAgICAgICAgIGRba2V5XSA9IHJlZihvLCBzZWxmLl9fbWFrZXJlbW92ZShrZXkpKQorICAgICAgICBpZiBsZW4oa3dhcmdzKToKKyAgICAgICAgICAgIHNlbGYudXBkYXRlKGt3YXJncykKIAogICAgIGRlZiB2YWx1ZXMoc2VsZik6CiAgICAgICAgIEwgPSBbXQpAQCAtMjM5LDEwICsyNDQsMTUgQEAKICAgICBkZWYgc2V0ZGVmYXVsdChzZWxmLCBrZXksIGRlZmF1bHQpOgogICAgICAgICByZXR1cm4gc2VsZi5kYXRhLnNldGRlZmF1bHQocmVmKGtleSwgc2VsZi5fcmVtb3ZlKSxkZWZhdWx0KQogCi0gICAgZGVmIHVwZGF0ZShzZWxmLCBkaWN0KToKKyAgICBkZWYgdXBkYXRlKHNlbGYsIGRpY3Q9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgICBkID0gc2VsZi5kYXRhCi0gICAgICAgIGZvciBrZXksIHZhbHVlIGluIGRpY3QuaXRlbXMoKToKLSAgICAgICAgICAgIGRbcmVmKGtleSwgc2VsZi5fcmVtb3ZlKV0gPSB2YWx1ZQorICAgICAgICBpZiBkaWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoZGljdCwgIml0ZW1zIik6CisgICAgICAgICAgICAgICAgZGljdCA9IHR5cGUoe30pKGRpY3QpCisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkaWN0Lml0ZW1zKCk6CisgICAgICAgICAgICAgICAgZFtyZWYoa2V5LCBzZWxmLl9yZW1vdmUpXSA9IHZhbHVlCisgICAgICAgIGlmIGxlbihrd2FyZ3MpOgorICAgICAgICAgICAgc2VsZi51cGRhdGUoa3dhcmdzKQogCiAKIGNsYXNzIEJhc2VJdGVyOgpkaWZmIC0tZ2l0IGEvTWlzYy9BQ0tTIGIvTWlzYy9BQ0tTCmluZGV4IDYxYjA3Y2IuLmJlZmM0NmIgMTAwNjQ0Ci0tLSBhL01pc2MvQUNLUworKysgYi9NaXNjL0FDS1MKQEAgLTI3Myw2ICsyNzMsNyBAQAogSnVhbiBEYXZpZCBJYuHxZXogUGFsb21hcgogVG9ueSBJbmdyYWxkaQogSm9obiBJbnRlcnJhbnRlCitCb2IgSXBwb2xpdG8KIEJlbiBKYWNrc29uCiBQYXVsIEphY2tzb24KIERhdmlkIEphY29icwpkaWZmIC0tZ2l0IGEvTWlzYy9ORVdTIGIvTWlzYy9ORVdTCmluZGV4IDFiZDZjMmIuLjcyMjMyYzggMTAwNjQ0Ci0tLSBhL01pc2MvTkVXUworKysgYi9NaXNjL05FV1MKQEAgLTMyLDYgKzMyLDEwIEBACiAgIHRoZSBvdmVyYWxsb2NhdGlvbiBpcyBubyBtb3JlIHRoYW4gdGhyZWUgZWxlbWVudHMgLS0gdGhpcyBpbXByb3ZlcyBzcGFjZQogICB1dGlsaXphdGlvbiBmb3IgYXBwbGljYXRpb25zIHRoYXQgaGF2ZSBsYXJnZSBudW1iZXJzIG9mIHNtYWxsIGxpc3RzLgogCistIFRoZSBkaWN0LnVwZGF0ZSgpIG1ldGhvZCBub3cgYWNjZXB0cyBhbGwgdGhlIHNhbWUgYXJndW1lbnQgZm9ybXMKKyAgYXMgdGhlIGRpY3QoKSBjb25zdHJ1Y3Rvci4gIFRoaXMgbm93IGluY2x1ZGVzIGl0ZW0gbGlzdHMgYW5kL29yCisgIGtleXdvcmQgYXJndW1lbnRzLgorCiAtIFN1cHBvcnQgZm9yIGFyYml0cmFyeSBvYmplY3RzIHN1cHBvcnRpbmcgdGhlIHJlYWQtb25seSBidWZmZXIKICAgaW50ZXJmYWNlIGFzIHRoZSBjb19jb2RlIGZpZWxkIG9mIGNvZGUgb2JqZWN0cyAoc29tZXRoaW5nIHRoYXQgd2FzCiAgIG9ubHkgcG9zc2libGUgdG8gY3JlYXRlIGZyb20gQyBjb2RlKSBoYXMgYmVlbiByZW1vdmVkLgpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9kaWN0b2JqZWN0LmMgYi9PYmplY3RzL2RpY3RvYmplY3QuYwppbmRleCBlYjAyMjJjLi5iNWNiZDY2IDEwMDY0NAotLS0gYS9PYmplY3RzL2RpY3RvYmplY3QuYworKysgYi9PYmplY3RzL2RpY3RvYmplY3QuYwpAQCAtMTAyOSwxMCArMTAyOSwzMCBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgUHlPYmplY3QgKgotZGljdF91cGRhdGUoUHlPYmplY3QgKm1wLCBQeU9iamVjdCAqb3RoZXIpCitzdGF0aWMgaW50CitkaWN0X3VwZGF0ZV9jb21tb24oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcywgY2hhciAqbWV0aG5hbWUpCiB7Ci0JaWYgKFB5RGljdF9VcGRhdGUobXAsIG90aGVyKSA8IDApCisJUHlPYmplY3QgKmFyZyA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIG1ldGhuYW1lLCAwLCAxLCAmYXJnKSkKKwkJcmVzdWx0ID0gLTE7CisKKwllbHNlIGlmIChhcmcgIT0gTlVMTCkgeworCQlpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhhcmcsICJrZXlzIikpCisJCQlyZXN1bHQgPSBQeURpY3RfTWVyZ2Uoc2VsZiwgYXJnLCAxKTsKKwkJZWxzZQorCQkJcmVzdWx0ID0gUHlEaWN0X01lcmdlRnJvbVNlcTIoc2VsZiwgYXJnLCAxKTsKKwl9CisJaWYgKHJlc3VsdCA9PSAwICYmIGt3ZHMgIT0gTlVMTCkKKwkJcmVzdWx0ID0gUHlEaWN0X01lcmdlKHNlbGYsIGt3ZHMsIDEpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitkaWN0X3VwZGF0ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQoreworCWlmIChkaWN0X3VwZGF0ZV9jb21tb24oc2VsZiwgYXJncywga3dkcywgInVwZGF0ZSIpID09IC0xKQogCQlyZXR1cm4gTlVMTDsKIAlQeV9JTkNSRUYoUHlfTm9uZSk7CiAJcmV0dXJuIFB5X05vbmU7CkBAIC0xODA2LDcgKzE4MjYsNyBAQAogCSBpdGVtc19fZG9jX199LAogCXsidmFsdWVzIiwJKFB5Q0Z1bmN0aW9uKWRpY3RfdmFsdWVzLAlNRVRIX05PQVJHUywKIAkgdmFsdWVzX19kb2NfX30sCi0JeyJ1cGRhdGUiLAkoUHlDRnVuY3Rpb24pZGljdF91cGRhdGUsCU1FVEhfTywKKwl7InVwZGF0ZSIsCShQeUNGdW5jdGlvbilkaWN0X3VwZGF0ZSwJTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKIAkgdXBkYXRlX19kb2NfX30sCiAJeyJmcm9ta2V5cyIsCShQeUNGdW5jdGlvbilkaWN0X2Zyb21rZXlzLAlNRVRIX1ZBUkFSR1MgfCBNRVRIX0NMQVNTLAogCSBmcm9ta2V5c19fZG9jX199LApAQCAtMTg3NSwyMSArMTg5NSw3IEBACiBzdGF0aWMgaW50CiBkaWN0X2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLQlQeU9iamVjdCAqYXJnID0gTlVMTDsKLQlpbnQgcmVzdWx0ID0gMDsKLQotCWlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRpY3QiLCAwLCAxLCAmYXJnKSkKLQkJcmVzdWx0ID0gLTE7Ci0KLQllbHNlIGlmIChhcmcgIT0gTlVMTCkgewotCQlpZiAoUHlPYmplY3RfSGFzQXR0clN0cmluZyhhcmcsICJrZXlzIikpCi0JCQlyZXN1bHQgPSBQeURpY3RfTWVyZ2Uoc2VsZiwgYXJnLCAxKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gUHlEaWN0X01lcmdlRnJvbVNlcTIoc2VsZiwgYXJnLCAxKTsKLQl9Ci0JaWYgKHJlc3VsdCA9PSAwICYmIGt3ZHMgIT0gTlVMTCkKLQkJcmVzdWx0ID0gUHlEaWN0X01lcmdlKHNlbGYsIGt3ZHMsIDEpOwotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIGRpY3RfdXBkYXRlX2NvbW1vbihzZWxmLCBhcmdzLCBrd2RzLCAiZGljdCIpOwogfQogCiBzdGF0aWMgbG9uZwo=