ZGlmZiAtLWdpdCBhL0xpYi9jb2xsZWN0aW9ucy5weSBiL0xpYi9jb2xsZWN0aW9ucy5weQppbmRleCA0YmRlNWIzLi41MTJjZjI4IDEwMDY0NAotLS0gYS9MaWIvY29sbGVjdGlvbnMucHkKKysrIGIvTGliL2NvbGxlY3Rpb25zLnB5CkBAIC00MzYsOCArNDM2LDYgQEAKICAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKTogcmV0dXJuIHNlbGYuZGF0YSA+PSBzZWxmLl9fY2FzdChvdGhlcikKICAgICBkZWYgX19jYXN0KHNlbGYsIG90aGVyKToKICAgICAgICAgcmV0dXJuIG90aGVyLmRhdGEgaWYgaXNpbnN0YW5jZShvdGhlciwgVXNlckxpc3QpIGVsc2Ugb3RoZXIKLSAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHJldHVybiBjbXAoc2VsZi5kYXRhLCBzZWxmLl9fY2FzdChvdGhlcikpCiAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKTogcmV0dXJuIGl0ZW0gaW4gc2VsZi5kYXRhCiAgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiBsZW4oc2VsZi5kYXRhKQogICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKTogcmV0dXJuIHNlbGYuZGF0YVtpXQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xpYmMucHkKaW5kZXggYjIwNGZhZS4uZmE0YzBjOSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9saWJjLnB5CkBAIC01LDYgKzUsMTAgQEAKIAogbGliID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAKK2RlZiB0aHJlZV93YXlfY21wKHgsIHkpOgorICAgICIiIlJldHVybiAtMSBpZiB4IDwgeSwgMCBpZiB4ID09IHkgYW5kIDEgaWYgeCA+IHkiIiIKKyAgICByZXR1cm4gKHggPiB5KSAtICh4IDwgeSkKKwogY2xhc3MgTGliVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3Rfc3FydChzZWxmKToKICAgICAgICAgbGliLm15X3NxcnQuYXJndHlwZXMgPSBjX2RvdWJsZSwKQEAgLTE5LDcgKzIzLDcgQEAKICAgICAgICAgbGliLm15X3Fzb3J0LnJlc3R5cGUgPSBOb25lCiAKICAgICAgICAgZGVmIHNvcnQoYSwgYik6Ci0gICAgICAgICAgICByZXR1cm4gY21wKGFbMF0sIGJbMF0pCisgICAgICAgICAgICByZXR1cm4gdGhyZWVfd2F5X2NtcChhWzBdLCBiWzBdKQogCiAgICAgICAgIGNoYXJzID0gY3JlYXRlX3N0cmluZ19idWZmZXIoInNwYW0sIHNwYW0sIGFuZCBzcGFtIikKICAgICAgICAgbGliLm15X3Fzb3J0KGNoYXJzLCBsZW4oY2hhcnMpLTEsIHNpemVvZihjX2NoYXIpLCBjb21wYXJlZnVuYyhzb3J0KSkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdmVyc2lvbi5weSBiL0xpYi9kaXN0dXRpbHMvdmVyc2lvbi5weQppbmRleCA5MDdmNzFjLi43NzgxNDM3IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3ZlcnNpb24ucHkKKysrIGIvTGliL2Rpc3R1dGlscy92ZXJzaW9uLnB5CkBAIC0yMSw3ICsyMSw3IEBACiAgICAgYW4gZXF1aXZhbGVudCBzdHJpbmcgLS0gaWUuIG9uZSB0aGF0IHdpbGwgZ2VuZXJhdGUgYW4gZXF1aXZhbGVudAogICAgIHZlcnNpb24gbnVtYmVyIGluc3RhbmNlKQogICAqIF9fcmVwcl9fIGdlbmVyYXRlcyBQeXRob24gY29kZSB0byByZWNyZWF0ZSB0aGUgdmVyc2lvbiBudW1iZXIgaW5zdGFuY2UKLSAgKiBfX2NtcF9fIGNvbXBhcmVzIHRoZSBjdXJyZW50IGluc3RhbmNlIHdpdGggZWl0aGVyIGFub3RoZXIgaW5zdGFuY2UKKyAgKiBfY21wIGNvbXBhcmVzIHRoZSBjdXJyZW50IGluc3RhbmNlIHdpdGggZWl0aGVyIGFub3RoZXIgaW5zdGFuY2UKICAgICBvZiB0aGUgc2FtZSBjbGFzcyBvciBhIHN0cmluZyAod2hpY2ggd2lsbCBiZSBwYXJzZWQgdG8gYW4gaW5zdGFuY2UKICAgICBvZiB0aGUgc2FtZSBjbGFzcywgdGh1cyBtdXN0IGZvbGxvdyB0aGUgc2FtZSBydWxlcykKICIiIgpAQCAtMzIsNyArMzIsNyBAQAogICAgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHZlcnNpb24gbnVtYmVyaW5nIGNsYXNzZXMuICBKdXN0IHByb3ZpZGVzCiAgICAgY29uc3RydWN0b3IgKF9faW5pdF9fKSBhbmQgcmVwcm9kdWNlciAoX19yZXByX18pLCBiZWNhdXNlIHRob3NlCiAgICAgc2VlbSB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIHZlcnNpb24gbnVtYmVyaW5nIGNsYXNzZXM7IGFuZCByb3V0ZQotICAgIHJpY2ggY29tcGFyaXNvbnMgdG8gX19jbXBfXy4KKyAgICByaWNoIGNvbXBhcmlzb25zIHRvIF9jbXAuCiAgICAgIiIiCiAKICAgICBkZWYgX19pbml0X18gKHNlbGYsIHZzdHJpbmc9Tm9uZSk6CkBAIC00MywzNyArNDMsMzcgQEAKICAgICAgICAgcmV0dXJuICIlcyAoJyVzJykiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZikpCiAKICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKLSAgICAgICAgYyA9IHNlbGYuX19jbXBfXyhvdGhlcikKKyAgICAgICAgYyA9IHNlbGYuX2NtcChvdGhlcikKICAgICAgICAgaWYgYyBpcyBOb3RJbXBsZW1lbnRlZDoKICAgICAgICAgICAgIHJldHVybiBjCiAgICAgICAgIHJldHVybiBjID09IDAKIAogICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgotICAgICAgICBjID0gc2VsZi5fX2NtcF9fKG90aGVyKQorICAgICAgICBjID0gc2VsZi5fY21wKG90aGVyKQogICAgICAgICBpZiBjIGlzIE5vdEltcGxlbWVudGVkOgogICAgICAgICAgICAgcmV0dXJuIGMKICAgICAgICAgcmV0dXJuIGMgIT0gMAogCiAgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIGMgPSBzZWxmLl9fY21wX18ob3RoZXIpCisgICAgICAgIGMgPSBzZWxmLl9jbXAob3RoZXIpCiAgICAgICAgIGlmIGMgaXMgTm90SW1wbGVtZW50ZWQ6CiAgICAgICAgICAgICByZXR1cm4gYwogICAgICAgICByZXR1cm4gYyA8IDAKIAogICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgotICAgICAgICBjID0gc2VsZi5fX2NtcF9fKG90aGVyKQorICAgICAgICBjID0gc2VsZi5fY21wKG90aGVyKQogICAgICAgICBpZiBjIGlzIE5vdEltcGxlbWVudGVkOgogICAgICAgICAgICAgcmV0dXJuIGMKICAgICAgICAgcmV0dXJuIGMgPD0gMAogCiAgICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIGMgPSBzZWxmLl9fY21wX18ob3RoZXIpCisgICAgICAgIGMgPSBzZWxmLl9jbXAob3RoZXIpCiAgICAgICAgIGlmIGMgaXMgTm90SW1wbGVtZW50ZWQ6CiAgICAgICAgICAgICByZXR1cm4gYwogICAgICAgICByZXR1cm4gYyA+IDAKIAogICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgotICAgICAgICBjID0gc2VsZi5fX2NtcF9fKG90aGVyKQorICAgICAgICBjID0gc2VsZi5fY21wKG90aGVyKQogICAgICAgICBpZiBjIGlzIE5vdEltcGxlbWVudGVkOgogICAgICAgICAgICAgcmV0dXJuIGMKICAgICAgICAgcmV0dXJuIGMgPj0gMApAQCAtOTEsNyArOTEsNyBAQAogIyAgICAgICAgICAgICAgICAgICAgICAgIChpZiBub3QgaWRlbnRpY2FsIHRvKSB0aGUgc3RyaW5nIHN1cHBsaWVkIHRvIHBhcnNlCiAjICAgIF9fcmVwcl9fIChzZWxmKSAgIC0gZ2VuZXJhdGUgUHl0aG9uIGNvZGUgdG8gcmVjcmVhdGUKICMgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5zdGFuY2UKLSMgICAgX19jbXBfXyAoc2VsZiwgb3RoZXIpIC0gY29tcGFyZSB0d28gdmVyc2lvbiBudW1iZXJzICgnb3RoZXInIG1heQorIyAgICBfY21wIChzZWxmLCBvdGhlcikgLSBjb21wYXJlIHR3byB2ZXJzaW9uIG51bWJlcnMgKCdvdGhlcicgbWF5CiAjICAgICAgICAgICAgICAgICAgICAgICAgYmUgYW4gdW5wYXJzZWQgdmVyc2lvbiBzdHJpbmcsIG9yIGFub3RoZXIKICMgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSBvZiB5b3VyIHZlcnNpb24gY2xhc3MpCiAKQEAgLTE2OSwzMCArMTY5LDM5IEBACiAgICAgICAgIHJldHVybiB2c3RyaW5nCiAKIAotICAgIGRlZiBfX2NtcF9fIChzZWxmLCBvdGhlcik6CisgICAgZGVmIF9jbXAgKHNlbGYsIG90aGVyKToKICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyKToKICAgICAgICAgICAgIG90aGVyID0gU3RyaWN0VmVyc2lvbihvdGhlcikKIAotICAgICAgICBjb21wYXJlID0gY21wKHNlbGYudmVyc2lvbiwgb3RoZXIudmVyc2lvbikKLSAgICAgICAgaWYgKGNvbXBhcmUgPT0gMCk6ICAgICAgICAgICAgICAjIGhhdmUgdG8gY29tcGFyZSBwcmVyZWxlYXNlCi0KLSAgICAgICAgICAgICMgY2FzZSAxOiBuZWl0aGVyIGhhcyBwcmVyZWxlYXNlOyB0aGV5J3JlIGVxdWFsCi0gICAgICAgICAgICAjIGNhc2UgMjogc2VsZiBoYXMgcHJlcmVsZWFzZSwgb3RoZXIgZG9lc24ndDsgb3RoZXIgaXMgZ3JlYXRlcgotICAgICAgICAgICAgIyBjYXNlIDM6IHNlbGYgZG9lc24ndCBoYXZlIHByZXJlbGVhc2UsIG90aGVyIGRvZXM6IHNlbGYgaXMgZ3JlYXRlcgotICAgICAgICAgICAgIyBjYXNlIDQ6IGJvdGggaGF2ZSBwcmVyZWxlYXNlOiBtdXN0IGNvbXBhcmUgdGhlbSEKLQotICAgICAgICAgICAgaWYgKG5vdCBzZWxmLnByZXJlbGVhc2UgYW5kIG5vdCBvdGhlci5wcmVyZWxlYXNlKToKLSAgICAgICAgICAgICAgICByZXR1cm4gMAotICAgICAgICAgICAgZWxpZiAoc2VsZi5wcmVyZWxlYXNlIGFuZCBub3Qgb3RoZXIucHJlcmVsZWFzZSk6CisgICAgICAgIGlmIHNlbGYudmVyc2lvbiAhPSBvdGhlci52ZXJzaW9uOgorICAgICAgICAgICAgIyBudW1lcmljIHZlcnNpb25zIGRvbid0IG1hdGNoCisgICAgICAgICAgICAjIHByZXJlbGVhc2Ugc3R1ZmYgZG9lc24ndCBtYXR0ZXIKKyAgICAgICAgICAgIGlmIHNlbGYudmVyc2lvbiA8IG90aGVyLnZlcnNpb246CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCi0gICAgICAgICAgICBlbGlmIChub3Qgc2VsZi5wcmVyZWxlYXNlIGFuZCBvdGhlci5wcmVyZWxlYXNlKToKKyAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgcmV0dXJuIDEKLSAgICAgICAgICAgIGVsaWYgKHNlbGYucHJlcmVsZWFzZSBhbmQgb3RoZXIucHJlcmVsZWFzZSk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLnByZXJlbGVhc2UsIG90aGVyLnByZXJlbGVhc2UpCiAKLSAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG51bWVyaWMgdmVyc2lvbnMgZG9uJ3QgbWF0Y2ggLS0KLSAgICAgICAgICAgIHJldHVybiBjb21wYXJlICAgICAgICAgICAgICAjIHByZXJlbGVhc2Ugc3R1ZmYgZG9lc24ndCBtYXR0ZXIKKyAgICAgICAgIyBoYXZlIHRvIGNvbXBhcmUgcHJlcmVsZWFzZQorICAgICAgICAjIGNhc2UgMTogbmVpdGhlciBoYXMgcHJlcmVsZWFzZTsgdGhleSdyZSBlcXVhbAorICAgICAgICAjIGNhc2UgMjogc2VsZiBoYXMgcHJlcmVsZWFzZSwgb3RoZXIgZG9lc24ndDsgb3RoZXIgaXMgZ3JlYXRlcgorICAgICAgICAjIGNhc2UgMzogc2VsZiBkb2Vzbid0IGhhdmUgcHJlcmVsZWFzZSwgb3RoZXIgZG9lczogc2VsZiBpcyBncmVhdGVyCisgICAgICAgICMgY2FzZSA0OiBib3RoIGhhdmUgcHJlcmVsZWFzZTogbXVzdCBjb21wYXJlIHRoZW0hCiAKKyAgICAgICAgaWYgKG5vdCBzZWxmLnByZXJlbGVhc2UgYW5kIG5vdCBvdGhlci5wcmVyZWxlYXNlKToKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGVsaWYgKHNlbGYucHJlcmVsZWFzZSBhbmQgbm90IG90aGVyLnByZXJlbGVhc2UpOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGVsaWYgKG5vdCBzZWxmLnByZXJlbGVhc2UgYW5kIG90aGVyLnByZXJlbGVhc2UpOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZWxpZiAoc2VsZi5wcmVyZWxlYXNlIGFuZCBvdGhlci5wcmVyZWxlYXNlKToKKyAgICAgICAgICAgIGlmIHNlbGYucHJlcmVsZWFzZSA9PSBvdGhlci5wcmVyZWxlYXNlOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBlbGlmIHNlbGYucHJlcmVsZWFzZSA8IG90aGVyLnByZXJlbGVhc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhc3NlcnQgRmFsc2UsICJuZXZlciBnZXQgaGVyZSIKIAogIyBlbmQgY2xhc3MgU3RyaWN0VmVyc2lvbgogCkBAIC0zMjUsNyArMzM0LDcgQEAKICAgICAgICAgcmV0dXJuICJMb29zZVZlcnNpb24gKCclcycpIiAlIHN0cihzZWxmKQogCiAKLSAgICBkZWYgX19jbXBfXyAoc2VsZiwgb3RoZXIpOgorICAgIGRlZiBfY21wIChzZWxmLCBvdGhlcik6CiAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cik6CiAgICAgICAgICAgICBvdGhlciA9IExvb3NlVmVyc2lvbihvdGhlcikKIApkaWZmIC0tZ2l0IGEvTGliL2hlYXBxLnB5IGIvTGliL2hlYXBxLnB5CmluZGV4IDE5MmU5ODIuLmZmNGZjMDMgMTAwNjQ0Ci0tLSBhL0xpYi9oZWFwcS5weQorKysgYi9MaWIvaGVhcHEucHkKQEAgLTI2Miw3ICsyNjIsNyBAQAogIwogIyBDdXR0aW5nIHRoZSAjIG9mIGNvbXBhcmlzb25zIGlzIGltcG9ydGFudCwgc2luY2UgdGhlc2Ugcm91dGluZXMgaGF2ZSBubwogIyB3YXkgdG8gZXh0cmFjdCAidGhlIHByaW9yaXR5IiBmcm9tIGFuIGFycmF5IGVsZW1lbnQsIHNvIHRoYXQgaW50ZWxsaWdlbmNlCi0jIGlzIGxpa2VseSB0byBiZSBoaWRpbmcgaW4gY3VzdG9tIF9fY21wX18gbWV0aG9kcywgb3IgaW4gYXJyYXkgZWxlbWVudHMKKyMgaXMgbGlrZWx5IHRvIGJlIGhpZGluZyBpbiBjdXN0b20gY29tcGFyaXNvbiBtZXRob2RzLCBvciBpbiBhcnJheSBlbGVtZW50cwogIyBzdG9yaW5nIChwcmlvcml0eSwgcmVjb3JkKSB0dXBsZXMuICBDb21wYXJpc29ucyBhcmUgdGh1cyBwb3RlbnRpYWxseQogIyBleHBlbnNpdmUuCiAjCmRpZmYgLS1naXQgYS9MaWIvbG9jYWxlLnB5IGIvTGliL2xvY2FsZS5weQppbmRleCA0MTE2ZWYxLi42MjgyOGZkIDEwMDY0NAotLS0gYS9MaWIvbG9jYWxlLnB5CisrKyBiL0xpYi9sb2NhbGUucHkKQEAgLTMxLDcgKzMxLDcgQEAKICAgICAiIiIgc3RyY29sbChzdHJpbmcsc3RyaW5nKSAtPiBpbnQuCiAgICAgICAgIENvbXBhcmVzIHR3byBzdHJpbmdzIGFjY29yZGluZyB0byB0aGUgbG9jYWxlLgogICAgICIiIgotICAgIHJldHVybiBjbXAoYSxiKQorICAgIHJldHVybiAoYSA+IGIpIC0gKGEgPCBiKQogCiBkZWYgX3N0cnhmcm0ocyk6CiAgICAgIiIiIHN0cnhmcm0oc3RyaW5nKSAtPiBzdHJpbmcuCmRpZmYgLS1naXQgYS9MaWIvcHlkb2MucHkgYi9MaWIvcHlkb2MucHkKaW5kZXggMjA4ZTg1ZS4uMmFlYThjMCAxMDA3NTUKLS0tIGEvTGliL3B5ZG9jLnB5CisrKyBiL0xpYi9weWRvYy5weQpAQCAtMTY0Myw3ICsxNjQzLDcgQEAKICAgICAgICAgJ1NQRUNJQUxNRVRIT0RTJzogKCdzcGVjaWFsbmFtZXMnLCAnQkFTSUNNRVRIT0RTIEFUVFJJQlVURU1FVEhPRFMgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NBTExBQkxFTUVUSE9EUyBTRVFVRU5DRU1FVEhPRFMxIE1BUFBJTkdNRVRIT0RTICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTRVFVRU5DRU1FVEhPRFMyIE5VTUJFUk1FVEhPRFMgQ0xBU1NFUycpLAotICAgICAgICAnQkFTSUNNRVRIT0RTJzogKCdjdXN0b21pemF0aW9uJywgJ2NtcCBoYXNoIHJlcHIgc3RyIFNQRUNJQUxNRVRIT0RTJyksCisgICAgICAgICdCQVNJQ01FVEhPRFMnOiAoJ2N1c3RvbWl6YXRpb24nLCAnaGFzaCByZXByIHN0ciBTUEVDSUFMTUVUSE9EUycpLAogICAgICAgICAnQVRUUklCVVRFTUVUSE9EUyc6ICgnYXR0cmlidXRlLWFjY2VzcycsICdBVFRSSUJVVEVTIFNQRUNJQUxNRVRIT0RTJyksCiAgICAgICAgICdDQUxMQUJMRU1FVEhPRFMnOiAoJ2NhbGxhYmxlLXR5cGVzJywgJ0NBTExTIFNQRUNJQUxNRVRIT0RTJyksCiAgICAgICAgICdTRVFVRU5DRU1FVEhPRFMnOiAoJ3NlcXVlbmNlLXR5cGVzJywgJ1NFUVVFTkNFUyBTRVFVRU5DRU1FVEhPRFMyICcKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5CmluZGV4IDY4NzJmZDYuLmMxNWM3YmUgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weQpAQCAtNDIsNyArNDIsNyBAQAogICAgIGRlZiBDaGVja0NyZWF0ZUNvbGxhdGlvbk5vdEFzY2lpKHNlbGYpOgogICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigiY29sbOQiLCBjbXApCisgICAgICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigiY29sbOQiLCBsYW1iZGEgeCwgeTogKHggPiB5KSAtICh4IDwgeSkpCiAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQogICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3IgYXMgZToKICAgICAgICAgICAgIHBhc3MKQEAgLTUyLDcgKzUyLDcgQEAKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBkZWYgbXljb2xsKHgsIHkpOgogICAgICAgICAgICAgIyByZXZlcnNlIG9yZGVyCi0gICAgICAgICAgICByZXR1cm4gLWNtcCh4LCB5KQorICAgICAgICAgICAgcmV0dXJuIC0oKHggPiB5KSAtICh4IDwgeSkpCiAKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIG15Y29sbCkKQEAgLTgyLDggKzgyLDggQEAKICAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIGxhc3Qgb25lIGlzIGFjdHVhbGx5IHVzZWQuCiAgICAgICAgICIiIgogICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQotICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgY21wKQotICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgbGFtYmRhIHgsIHk6IC1jbXAoeCwgeSkpCisgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBsYW1iZGEgeCwgeTogKHggPiB5KSAtICh4IDwgeSkpCisgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBsYW1iZGEgeCwgeTogLSgoeCA+IHkpIC0gKHggPCB5KSkpCiAgICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKCIiIgogICAgICAgICAgICAgc2VsZWN0IHggZnJvbSAoc2VsZWN0ICdhJyBhcyB4IHVuaW9uIHNlbGVjdCAnYicgYXMgeCkgb3JkZXIgYnkgeCBjb2xsYXRlIG15Y29sbAogICAgICAgICAgICAgIiIiKS5mZXRjaGFsbCgpCkBAIC05Niw3ICs5Niw3IEBACiAgICAgICAgIHRvIHVzZSBpdC4KICAgICAgICAgIiIiCiAgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCi0gICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBjbXApCisgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBsYW1iZGEgeCwgeTogKHggPiB5KSAtICh4IDwgeSkpCiAgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBOb25lKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBjb24uZXhlY3V0ZSgic2VsZWN0ICdhJyBhcyB4IHVuaW9uIHNlbGVjdCAnYicgYXMgeCBvcmRlciBieSB4IGNvbGxhdGUgbXljb2xsIikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NyYXNoZXJzL2xvb3NpbmdfbXJvX3JlZi5weSBiL0xpYi90ZXN0L2NyYXNoZXJzL2xvb3NpbmdfbXJvX3JlZi5weQppbmRleCBhOGM2ZTYzLi5iM2JjZDMyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9jcmFzaGVycy9sb29zaW5nX21yb19yZWYucHkKKysrIGIvTGliL3Rlc3QvY3Jhc2hlcnMvbG9vc2luZ19tcm9fcmVmLnB5CkBAIC0xMCw3ICsxMCw3IEBACiAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICByZXR1cm4gaGFzaCgnbXlrZXknKQogCi0gICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICAjIHRoZSBmb2xsb3dpbmcgbGluZSBkZWNyZWZzIHRoZSBwcmV2aW91cyBYLl9fbXJvX18KICAgICAgICAgWC5fX2Jhc2VzX18gPSAoQmFzZTIsKQogICAgICAgICAjIHRyYXNoIGFsbCB0dXBsZXMgb2YgbGVuZ3RoIDMsIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBpdGVtcyBvZgpAQCAtMTgsNyArMTgsNyBAQAogICAgICAgICB6ID0gW10KICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwMCk6CiAgICAgICAgICAgICB6LmFwcGVuZCgoaSwgTm9uZSwgTm9uZSkpCi0gICAgICAgIHJldHVybiAtMQorICAgICAgICByZXR1cm4gMAogCiAKIGNsYXNzIEJhc2Uob2JqZWN0KToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpc3RfdGVzdHMucHkgYi9MaWIvdGVzdC9saXN0X3Rlc3RzLnB5CmluZGV4IDViMWFhNzUuLjY3NDkyZjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2xpc3RfdGVzdHMucHkKKysrIGIvTGliL3Rlc3QvbGlzdF90ZXN0cy5weQpAQCAtNDM5LDEzICs0MzksMjQgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1LnNvcnQsIDQyLCA0MikKIAogICAgICAgICBkZWYgcmV2Y21wKGEsIGIpOgotICAgICAgICAgICAgcmV0dXJuIGNtcChiLCBhKQorICAgICAgICAgICAgaWYgYSA9PSBiOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBlbGlmIGEgPCBiOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICBlbHNlOiAjIGEgPiBiCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCiAgICAgICAgIHUuc29ydChrZXk9Q21wVG9LZXkocmV2Y21wKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBzZWxmLnR5cGUydGVzdChbMiwxLDAsLTEsLTJdKSkKIAogICAgICAgICAjIFRoZSBmb2xsb3dpbmcgZHVtcHMgY29yZSBpbiB1bnBhdGNoZWQgUHl0aG9uIDEuNToKICAgICAgICAgZGVmIG15Q29tcGFyaXNvbih4LHkpOgotICAgICAgICAgICAgcmV0dXJuIGNtcCh4JTMsIHklNykKKyAgICAgICAgICAgIHhtb2QsIHltb2QgPSB4JTMsIHklNworICAgICAgICAgICAgaWYgeG1vZCA9PSB5bW9kOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBlbGlmIHhtb2QgPCB5bW9kOgorICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgZWxzZTogIyB4bW9kID4geW1vZAorICAgICAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgIHogPSBzZWxmLnR5cGUydGVzdChyYW5nZSgxMikpCiAgICAgICAgIHouc29ydChrZXk9Q21wVG9LZXkobXlDb21wYXJpc29uKSkKIApAQCAtNDUzLDcgKzQ2NCwxMiBAQAogCiAgICAgICAgIGRlZiBzZWxmbW9kaWZ5aW5nQ29tcGFyaXNvbih4LHkpOgogICAgICAgICAgICAgei5hcHBlbmQoMSkKLSAgICAgICAgICAgIHJldHVybiBjbXAoeCwgeSkKKyAgICAgICAgICAgIGlmIHggPT0geToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZWxpZiB4IDwgeToKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGVsc2U6ICMgeCA+IHkKKyAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB6LnNvcnQsIGtleT1DbXBUb0tleShzZWxmbW9kaWZ5aW5nQ29tcGFyaXNvbikpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB6LnNvcnQsIDQyLCA0MiwgNDIsIDQyKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5IGIvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CmluZGV4IDcxNzViODAuLjk5Nzg1ZGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKQEAgLTEwLDYgKzEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEZ1dHVyZVdhcm5pbmcsIF9fbmFtZV9fKQogd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgInVuaXR0ZXN0IikKK2ltcG9ydCBidWlsdGlucwogCiBjbGFzcyBTcXVhcmVzOgogCkBAIC0yMTksMjEgKzIyMCw5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChPdmVyZmxvd0Vycm9yLCBWYWx1ZUVycm9yKSwgY2hyLCAyKiozMikKIAogICAgIGRlZiB0ZXN0X2NtcChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoLTEsIDEpLCAtMSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoMSwgLTEpLCAxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCgxLCAxKSwgMCkKLSAgICAgICAgIyB2ZXJpZnkgdGhhdCBjaXJjdWxhciBvYmplY3RzIGFyZSBub3QgaGFuZGxlZAotICAgICAgICBhID0gW107IGEuYXBwZW5kKGEpCi0gICAgICAgIGIgPSBbXTsgYi5hcHBlbmQoYikKLSAgICAgICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgVXNlckxpc3QKLSAgICAgICAgYyA9IFVzZXJMaXN0KCk7IGMuYXBwZW5kKGMpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgY21wLCBhLCBiKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGNtcCwgYiwgYykKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBjbXAsIGMsIGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgY21wLCBhLCBjKQotICAgICAgICMgb2theSwgbm93IGJyZWFrIHRoZSBjeWNsZXMKLSAgICAgICAgYS5wb3AoKTsgYi5wb3AoKTsgYy5wb3AoKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCkKKyAgICAgICAgIyB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lIG9uY2UgY21wIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgICAgI3NlbGYuYXNzZXJ0Xyhub3QgaGFzYXR0cihidWlsdGlucywgImNtcCIpKQorICAgICAgICBwYXNzCiAKICAgICBkZWYgdGVzdF9jb21waWxlKHNlbGYpOgogICAgICAgICBjb21waWxlKCdwcmludCgxKVxuJywgJycsICdleGVjJykKQEAgLTczNiwxMCArNzI1LDYgQEAKICAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CiAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtaW4sIEJhZFNlcSgpKQotICAgICAgICBjbGFzcyBCYWROdW1iZXI6Ci0gICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1pbiwgKDQyLCBCYWROdW1iZXIoKSkpCiAKICAgICAgICAgZm9yIHN0bXQgaW4gKAogICAgICAgICAgICAgIm1pbihrZXk9aW50KSIsICAgICAgICAgICAgICAgICAjIG5vIGFyZ3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29udGFpbnMucHkgYi9MaWIvdGVzdC90ZXN0X2NvbnRhaW5zLnB5CmluZGV4IDM5YzYxYmQuLjNmMGIyMzQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29udGFpbnMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb250YWlucy5weQpAQCAtNTYsMzEgKzU2LDE2IEBACiAgICAgICAgICAgICBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb250YWlucyBjb2RlCiAgICAgICAgICAgICB3b3JrcyB3aGVuIHRoZSBsaXN0IGlzIG1vZGlmaWVkIGR1cmluZyB0aGUgY2hlY2suCiAgICAgICAgICAgICAiIiIKLSAgICAgICAgICAgIGFMaXN0ID0gcmFuZ2UoMTUpCi0gICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICBhTGlzdCA9IGxpc3QocmFuZ2UoMTUpKQorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgICAgICAgICAgaWYgb3RoZXIgPT0gMTI6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYUxpc3QucmVtb3ZlKDEyKQogICAgICAgICAgICAgICAgICAgICBzZWxmLmFMaXN0LnJlbW92ZSgxMykKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hTGlzdC5yZW1vdmUoMTQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgICAgICByZXR1cm4gMAogCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhEZXZpYW50MSgpIG5vdCBpbiBEZXZpYW50MS5hTGlzdCkKIAotICAgICAgICBjbGFzcyBEZXZpYW50MjoKLSAgICAgICAgICAgICIiIkJlaGF2ZXMgc3RyYW5nZWx5IHdoZW4gY29tcGFyZWQKLQotICAgICAgICAgICAgVGhpcyBjbGFzcyByYWlzZXMgYW4gZXhjZXB0aW9uIGR1cmluZyBjb21wYXJpc29uLiAgVGhhdCBpbgotICAgICAgICAgICAgdHVybiBjYXVzZXMgdGhlIGNvbXBhcmlzb24gdG8gZmFpbCB3aXRoIGEgVHlwZUVycm9yLgotICAgICAgICAgICAgIiIiCi0gICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgICAgICAgICAgaWYgb3RoZXIgPT0gNDoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJnb3RjaGEiKQotCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhEZXZpYW50MigpIG5vdCBpbiBhKQotICAgICAgICBleGNlcHQgVHlwZUVycm9yOgotICAgICAgICAgICAgcGFzcwotCiAgICAgZGVmIHRlc3Rfbm9ucmVmbGV4aXZlKHNlbGYpOgogICAgICAgICAjIGNvbnRhaW5tZW50IGFuZCBlcXVhbGl0eSB0ZXN0cyBpbnZvbHZpbmcgZWxlbWVudHMgdGhhdCBhcmUKICAgICAgICAgIyBub3QgbmVjZXNzYXJpbHkgZXF1YWwgdG8gdGhlbXNlbHZlcwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb3B5LnB5IGIvTGliL3Rlc3QvdGVzdF9jb3B5LnB5CmluZGV4IDUwMGZhODMuLjEzM2M4ODggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29weS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvcHkucHkKQEAgLTIsMTAgKzIsMTQgQEAKIAogaW1wb3J0IGNvcHkKIGltcG9ydCBjb3B5cmVnCi0KK2Zyb20gb3BlcmF0b3IgaW1wb3J0IGxlLCBsdCwgZ2UsIGd0LCBlcSwgbmUKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKK29yZGVyX2NvbXBhcmlzb25zID0gbGUsIGx0LCBnZSwgZ3QKK2VxdWFsaXR5X2NvbXBhcmlzb25zID0gZXEsIG5lCitjb21wYXJpc29ucyA9IG9yZGVyX2NvbXBhcmlzb25zICsgZXF1YWxpdHlfY29tcGFyaXNvbnMKKwogY2xhc3MgVGVzdENvcHkodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgIyBBdHRlbXB0IGZ1bGwgbGluZSBjb3ZlcmFnZSBvZiBjb3B5LnB5IGZyb20gdG9wIHRvIGJvdHRvbQpAQCAtMjcxLDcgKzI3NSw4IEBACiAgICAgICAgIHggPSBbXQogICAgICAgICB4LmFwcGVuZCh4KQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGNtcCwgeSwgeCkKKyAgICAgICAgZm9yIG9wIGluIGNvbXBhcmlzb25zOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBvcCwgeSwgeCkKICAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgbm90IHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyh5WzBdIGlzIHkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHkpLCAxKQpAQCAtMjg3LDcgKzI5Miw4IEBACiAgICAgICAgIHggPSAoW10sKQogICAgICAgICB4WzBdLmFwcGVuZCh4KQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGNtcCwgeSwgeCkKKyAgICAgICAgZm9yIG9wIGluIGNvbXBhcmlzb25zOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBvcCwgeSwgeCkKICAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgbm90IHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyh5WzBdIGlzIG5vdCB4WzBdKQogICAgICAgICBzZWxmLmFzc2VydF8oeVswXVswXSBpcyB5KQpAQCAtMzAzLDcgKzMwOSwxMCBAQAogICAgICAgICB4ID0ge30KICAgICAgICAgeFsnZm9vJ10gPSB4CiAgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCB5LCB4KQorICAgICAgICBmb3Igb3AgaW4gb3JkZXJfY29tcGFyaXNvbnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wLCB5LCB4KQorICAgICAgICBmb3Igb3AgaW4gZXF1YWxpdHlfY29tcGFyaXNvbnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG9wLCB5LCB4KQogICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKICAgICAgICAgc2VsZi5hc3NlcnRfKHlbJ2ZvbyddIGlzIHkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHkpLCAxKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weSBiL0xpYi90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkKaW5kZXggNzk3ODAwZi4uYjlkNTk1OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5CkBAIC03LDYgKzcsOCBAQAogaW1wb3J0IHBpY2tsZQogaW1wb3J0IHVuaXR0ZXN0CiAKK2Zyb20gb3BlcmF0b3IgaW1wb3J0IGx0LCBsZSwgZ3QsIGdlLCBlcSwgbmUKKwogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIGZyb20gZGF0ZXRpbWUgaW1wb3J0IE1JTllFQVIsIE1BWFlFQVIKQEAgLTE1Niw5ICsxNTgsNiBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogKCkgPiBtZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6ICgpID49IG1lKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCAoKSwgbWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCBtZSwgKCkpCi0KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIHRpbWVkZWx0YSB0ZXN0cwogCkBAIC0zMDksOCArMzA4LDYgQEAKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSAhPSB0MikKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA8IHQyKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxID4gdDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDApCiAKICAgICAgICAgZm9yIGFyZ3MgaW4gKDMsIDMsIDMpLCAoMiwgNCwgNCksICgyLCAzLCA1KToKICAgICAgICAgICAgIHQyID0gdGltZWRlbHRhKCphcmdzKSAgICMgdGhpcyBpcyBsYXJnZXIgdGhhbiB0MQpAQCAtMzI2LDggKzMyMyw2IEBACiAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQyIDwgdDEpCiAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxID49IHQyKQogICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MiA8PSB0MSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIC0xKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDIsIHQxKSwgMSkKIAogICAgICAgICBmb3IgYmFkYXJnIGluIE9USEVSU1RVRkY6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxID09IGJhZGFyZywgRmFsc2UpCkBAIC05NTMsOCArOTQ4LDYgQEAKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSAhPSB0MikKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA8IHQyKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxID4gdDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDApCiAKICAgICAgICAgZm9yIGFyZ3MgaW4gKDMsIDMsIDMpLCAoMiwgNCwgNCksICgyLCAzLCA1KToKICAgICAgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcygqYXJncykgICAjIHRoaXMgaXMgbGFyZ2VyIHRoYW4gdDEKQEAgLTk3MCw4ICs5NjMsNiBAQAogICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MiA8IHQxKQogICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA+PSB0MikKICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDIgPD0gdDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MSwgdDIpLCAtMSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDEpCiAKICAgICAgICAgZm9yIGJhZGFyZyBpbiBPVEhFUlNUVUZGOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSA9PSBiYWRhcmcsIEZhbHNlKQpAQCAtOTk5LDggKzk5MCw2IEBACiAgICAgICAgICMgQnV0IHRoZSBvcmRlcmluZyBpcyB1bmRlZmluZWQKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IG91ciA8IDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiAxIDwgb3VyKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgb3VyLCAxKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgMSwgb3VyKQogCiAgICAgICAgICMgUmVwZWF0IHRob3NlIHRlc3RzIHdpdGggYSBkaWZmZXJlbnQgY2xhc3MKIApAQCAtMTAxNCw4ICsxMDAzLDYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aGVpciAhPSBvdXIsIFRydWUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBvdXIgPCB0aGVpcikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHRoZWlyIDwgb3VyKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgb3VyLCB0aGVpcikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXAsIHRoZWlyLCBvdXIpCiAKICAgICAgICAgIyBIb3dldmVyLCBpZiB0aGUgb3RoZXIgY2xhc3MgZXhwbGljaXRseSBkZWZpbmVzIG9yZGVyaW5nCiAgICAgICAgICMgcmVsYXRpdmUgdG8gb3VyIGNsYXNzLCBpdCBpcyBhbGxvd2VkIHRvIGRvIHNvCkBAIC0xMDQxLDggKzEwMjgsNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRoZWlyICE9IG91ciwgVHJ1ZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXIgPCB0aGVpciwgVHJ1ZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aGVpciA8IG91ciwgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKG91ciwgdGhlaXIpLCAtMSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodGhlaXIsIG91ciksIDEpCiAKICAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgogICAgICAgICAjIEFsbCBkYXRlcyBhcmUgY29uc2lkZXJlZCB0cnVlLgpAQCAtMTQ0MCw4ICsxNDI1LDYgQEAKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSAhPSB0MikKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA8IHQyKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxID4gdDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDApCiAKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGFyZ3MpKToKICAgICAgICAgICAgIG5ld2FyZ3MgPSBhcmdzWzpdCkBAIC0xNDU5LDggKzE0NDIsNiBAQAogICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MiA8IHQxKQogICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA+PSB0MikKICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDIgPD0gdDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MSwgdDIpLCAtMSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDEpCiAKIAogICAgICMgQSBoZWxwZXIgZm9yIHRpbWVzdGFtcCBjb25zdHJ1Y3RvciB0ZXN0cy4KQEAgLTE3MjgsOCArMTcwOSw2IEBACiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgIT0gdDIpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPCB0MikKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA+IHQyKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MSwgdDIpLCAwKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MiwgdDEpLCAwKQogCiAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihhcmdzKSk6CiAgICAgICAgICAgICBuZXdhcmdzID0gYXJnc1s6XQpAQCAtMTc0Nyw4ICsxNzI2LDYgQEAKICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDIgPCB0MSkKICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPj0gdDIpCiAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQyIDw9IHQxKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDEsIHQyKSwgLTEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MiwgdDEpLCAxKQogCiAgICAgICAgIGZvciBiYWRhcmcgaW4gT1RIRVJTVFVGRjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEgPT0gYmFkYXJnLCBGYWxzZSkKQEAgLTIxMjIsOSArMjA5OSwxMCBAQAogICAgICAgICBkMiA9IGJhc2UucmVwbGFjZShtaW51dGU9MTEpCiAgICAgICAgIGZvciB4IGluIGQwLCBkMSwgZDI6CiAgICAgICAgICAgICBmb3IgeSBpbiBkMCwgZDEsIGQyOgotICAgICAgICAgICAgICAgIGdvdCA9IGNtcCh4LCB5KQotICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gY21wKHgubWludXRlLCB5Lm1pbnV0ZSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgZm9yIG9wIGluIGx0LCBsZSwgZ3QsIGdlLCBlcSwgbmU6CisgICAgICAgICAgICAgICAgICAgIGdvdCA9IG9wKHgsIHkpCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gb3AoeC5taW51dGUsIHkubWludXRlKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCiAKICAgICAgICAgIyBIb3dldmVyLCBpZiB0aGV5J3JlIGRpZmZlcmVudCBtZW1iZXJzLCB1Y3RvZmZzZXQgaXMgbm90IGlnbm9yZWQuCiAgICAgICAgICMgTm90ZSB0aGF0IGEgdGltZSBjYW4ndCBhY3R1YWxseSBoYXZlIGFuIG9wZXJhbmQtZGVwZWRlbnQgb2Zmc2V0LApAQCAtMjEzNiw3ICsyMTE0LDcgQEAKICAgICAgICAgICAgIGQyID0gYmFzZS5yZXBsYWNlKG1pbnV0ZT0xMSwgdHppbmZvPU9wZXJhbmREZXBlbmRlbnRPZmZzZXQoKSkKICAgICAgICAgICAgIGZvciB4IGluIGQwLCBkMSwgZDI6CiAgICAgICAgICAgICAgICAgZm9yIHkgaW4gZDAsIGQxLCBkMjoKLSAgICAgICAgICAgICAgICAgICAgZ290ID0gY21wKHgsIHkpCisgICAgICAgICAgICAgICAgICAgIGdvdCA9ICh4ID4geSkgLSAoeCA8IHkpCiAgICAgICAgICAgICAgICAgICAgIGlmICh4IGlzIGQwIG9yIHggaXMgZDEpIGFuZCAoeSBpcyBkMCBvciB5IGlzIGQxKToKICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gMAogICAgICAgICAgICAgICAgICAgICBlbGlmIHggaXMgeSBpcyBkMjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weSBiL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQppbmRleCA5NjQzODA0Li43OThmNGQ4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CkBAIC0xMDEyLDE3ICsxMDEyLDExIEBACiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhkYSAhPSBkYykKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRhIDw9IGRiKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZGEgPj0gZGIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGRjLGRhKSwgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZGEsZGMpLCAtMSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZGEsZGIpLCAwKQogCiAgICAgICAgICNhIERlY2ltYWwgYW5kIGFuIGludAogICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZGMgPiAyMykKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKDIzIDwgZGMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGMsIDQ1KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChkYywyMyksIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKDIzLGRjKSwgLTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGRjLDQ1KSwgMCkKIAogICAgICAgICAjYSBEZWNpbWFsIGFuZCB1bmNvbXBhcmFibGUKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkYSwgJ3VnbHknKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZXF1ZS5weSBiL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkKaW5kZXggMjdjODljNC4uNWQ5NzVmNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZXF1ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5CkBAIC0xMDMsNyArMTAzLDYgQEAKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHggPD0geSwgbGlzdCh4KSA8PSBsaXN0KHkpLCAoeCx5KSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHggPiAgeSwgbGlzdCh4KSA+ICBsaXN0KHkpLCAoeCx5KSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHggPj0geSwgbGlzdCh4KSA+PSBsaXN0KHkpLCAoeCx5KSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh4LHkpLCBjbXAobGlzdCh4KSxsaXN0KHkpKSwgKHgseSkpCiAKICAgICBkZWYgdGVzdF9leHRlbmQoc2VsZik6CiAgICAgICAgIGQgPSBkZXF1ZSgnYScpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXNjci5weQppbmRleCAxMDIwNzQwLi45Y2VkZjQ0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKQEAgLTE3Miw3ICsxNzIsNiBAQAogCiAgICAgZGVmIHRlc3RfZGljdHMoc2VsZik6CiAgICAgICAgICMgVGVzdGluZyBkaWN0IG9wZXJhdGlvbnMuLi4KLSAgICAgICAgIyMgc2VsZi5iaW5vcF90ZXN0KHsxOjJ9LCB7MjoxfSwgLTEsICJjbXAoYSxiKSIsICJfX2NtcF9fIikKICAgICAgICAgc2VsZi5iaW5vcF90ZXN0KHsxOjIsMzo0fSwgMSwgMSwgImIgaW4gYSIsICJfX2NvbnRhaW5zX18iKQogICAgICAgICBzZWxmLmJpbm9wX3Rlc3QoezE6MiwzOjR9LCAyLCAwLCAiYiBpbiBhIiwgIl9fY29udGFpbnNfXyIpCiAgICAgICAgIHNlbGYuYmlub3BfdGVzdCh7MToyLDM6NH0sIDEsIDIsICJhW2JdIiwgIl9fZ2V0aXRlbV9fIikKQEAgLTMzMiw4ICszMzEsNiBAQAogICAgICAgICAjIFRoaXMgaXMgYW4gdWdseSBoYWNrOgogICAgICAgICBjb3B5Ll9kZWVwY29weV9kaXNwYXRjaFtzcGFtLnNwYW1kaWN0XSA9IHNwYW1kaWN0CiAKLSAgICAgICAgIyMgc2VsZi5iaW5vcF90ZXN0KHNwYW1kaWN0KHsxOjJ9KSwgc3BhbWRpY3QoezI6MX0pLCAtMSwgImNtcChhLGIpIiwKLSAgICAgICAgIyMgICAgICAgICAgICAgICAgICJfX2NtcF9fIikKICAgICAgICAgc2VsZi5iaW5vcF90ZXN0KHNwYW1kaWN0KHsxOjIsMzo0fSksIDEsIDEsICJiIGluIGEiLCAiX19jb250YWluc19fIikKICAgICAgICAgc2VsZi5iaW5vcF90ZXN0KHNwYW1kaWN0KHsxOjIsMzo0fSksIDIsIDAsICJiIGluIGEiLCAiX19jb250YWluc19fIikKICAgICAgICAgc2VsZi5iaW5vcF90ZXN0KHNwYW1kaWN0KHsxOjIsMzo0fSksIDEsIDIsICJhW2JdIiwgIl9fZ2V0aXRlbV9fIikKQEAgLTEwMDQsOCArMTAwMSw4IEBACiAgICAgICAgICMgVGVzdCBsb29rdXAgbGVha3MgW1NGIGJ1ZyA1NzI1NjddCiAgICAgICAgIGltcG9ydCBzeXMsZ2MKICAgICAgICAgY2xhc3MgRyhvYmplY3QpOgotICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgotICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICBnID0gRygpCiAgICAgICAgIG9yaWdfb2JqZWN0cyA9IGxlbihnYy5nZXRfb2JqZWN0cygpKQogICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CkBAIC0xNTI1LDcgKzE1MjIsNiBAQAogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGMxKSwgaWQoYzIpKQogICAgICAgICBoYXNoKGMxKQogICAgICAgICBoYXNoKGMyKQotICAgICAgICAjIyBzZWxmLmFzc2VydEVxdWFsKGNtcChjMSwgYzIpLCBjbXAoaWQoYzEpLCBpZChjMikpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMxLCBjMSkKICAgICAgICAgc2VsZi5hc3NlcnRfKGMxICE9IGMyKQogICAgICAgICBzZWxmLmFzc2VydF8obm90IGMxICE9IGMxKQpAQCAtMTU0OSw3ICsxNTQ1LDYgQEAKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkMSksIGlkKGQyKSkKICAgICAgICAgaGFzaChkMSkKICAgICAgICAgaGFzaChkMikKLSAgICAgICAgIyMgc2VsZi5hc3NlcnRFcXVhbChjbXAoZDEsIGQyKSwgY21wKGlkKGQxKSwgaWQoZDIpKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgZDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZDEsIGQyKQogICAgICAgICBzZWxmLmFzc2VydF8obm90IGQxICE9IGQxKQpAQCAtMTYxMCwyMyArMTYwNSw2IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaSBpbiBwMTApCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoMTAgaW4gcDEwKQogCi0gICAgICAgICMjICMgU2FmZXR5IHRlc3QgZm9yIF9fY21wX18KLSAgICAgICAgIyMgZGVmIHVuc2FmZWNtcChhLCBiKToKLSAgICAgICAgIyMgICAgIHRyeToKLSAgICAgICAgIyMgICAgICAgICBhLl9fY2xhc3NfXy5fX2NtcF9fKGEsIGIpCi0gICAgICAgICMjICAgICBleGNlcHQgVHlwZUVycm9yOgotICAgICAgICAjIyAgICAgICAgIHBhc3MKLSAgICAgICAgIyMgICAgIGVsc2U6Ci0gICAgICAgICMjICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgYWxsb3cgJXMuX19jbXBfXyglciwgJXIpIiAlICgKLSAgICAgICAgIyMgICAgICAgICAgICAgYS5fX2NsYXNzX18sIGEsIGIpKQotICAgICAgICAjIwotICAgICAgICAjIyB1bnNhZmVjbXAoIjEyMyIsICIxMjMiKQotICAgICAgICAjIyB1bnNhZmVjbXAoIjEyMyIsICIxMjMiKQotICAgICAgICAjIyB1bnNhZmVjbXAoMSwgMS4wKQotICAgICAgICAjIyB1bnNhZmVjbXAoMS4wLCAxKQotICAgICAgICAjIyB1bnNhZmVjbXAoMSwgMSkKLSAgICAgICAgIyMgdW5zYWZlY21wKDEsIDEpCi0KICAgICBkZWYgdGVzdF93ZWFrcmVmcyhzZWxmKToKICAgICAgICAgIyBUZXN0aW5nIHdlYWsgcmVmZXJlbmNlcy4uLgogICAgICAgICBpbXBvcnQgd2Vha3JlZgpAQCAtMjUzOCwxMiArMjUxNiwxNiBAQAogICAgICAgICAgICAgYyA9IHsxOiBjMSwgMjogYzIsIDM6IGMzfQogICAgICAgICAgICAgZm9yIHggaW4gMSwgMiwgMzoKICAgICAgICAgICAgICAgICBmb3IgeSBpbiAxLCAyLCAzOgotICAgICAgICAgICAgICAgICAgICAjIyBzZWxmLmFzc2VydF8oY21wKGNbeF0sIGNbeV0pID09IGNtcCh4LCB5KSwgIng9JWQsIHk9JWQiICUgKHgsIHkpKQogICAgICAgICAgICAgICAgICAgICBmb3Igb3AgaW4gIjwiLCAiPD0iLCAiPT0iLCAiIT0iLCAiPiIsICI+PSI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZXZhbCgiY1t4XSAlcyBjW3ldIiAlIG9wKSA9PSBldmFsKCJ4ICVzIHkiICUgb3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4PSVkLCB5PSVkIiAlICh4LCB5KSkKLSAgICAgICAgICAgICAgICAgICAgIyMgc2VsZi5hc3NlcnRfKGNtcChjW3hdLCB5KSA9PSBjbXAoeCwgeSksICJ4PSVkLCB5PSVkIiAlICh4LCB5KSkKLSAgICAgICAgICAgICAgICAgICAgIyMgc2VsZi5hc3NlcnRfKGNtcCh4LCBjW3ldKSA9PSBjbXAoeCwgeSksICJ4PSVkLCB5PSVkIiAlICh4LCB5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhldmFsKCJjW3hdICVzIGNbeV0iICUgb3ApID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbCgieCAlcyB5IiAlIG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZXZhbCgiY1t4XSAlcyB5IiAlIG9wKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwoInggJXMgeSIgJSBvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIng9JWQsIHk9JWQiICUgKHgsIHkpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGV2YWwoInggJXMgY1t5XSIgJSBvcCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsKCJ4ICVzIHkiICUgb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4PSVkLCB5PSVkIiAlICh4LCB5KSkKIAogICAgIGRlZiB0ZXN0X3JpY2hfY29tcGFyaXNvbnMoc2VsZik6CiAgICAgICAgICMgVGVzdGluZyByaWNoIGNvbXBhcmlzb25zLi4uCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RpY3QucHkgYi9MaWIvdGVzdC90ZXN0X2RpY3QucHkKaW5kZXggMmU3NGI2OC4uYmZjMzFhZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kaWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGljdC5weQpAQCAtNTcwLDcgKzU3MCw3IEBACiAgICAgICAgICAgICBzZWxmLmZhaWwoIm1pc3NpbmcgS2V5RXJyb3IiKQogCiAgICAgZGVmIHRlc3RfYmFkX2tleShzZWxmKToKLSAgICAgICAgIyBEaWN0aW9uYXJ5IGxvb2t1cHMgc2hvdWxkIGZhaWwgaWYgX19jbXBfXygpIHJhaXNlcyBhbiBleGNlcHRpb24uCisgICAgICAgICMgRGljdGlvbmFyeSBsb29rdXBzIHNob3VsZCBmYWlsIGlmIF9fZXFfXygpIHJhaXNlcyBhbiBleGNlcHRpb24uCiAgICAgICAgIGNsYXNzIEN1c3RvbUV4Y2VwdGlvbihFeGNlcHRpb24pOgogICAgICAgICAgICAgcGFzcwogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2hhc2gucHkgYi9MaWIvdGVzdC90ZXN0X2hhc2gucHkKaW5kZXggODA3YzJjNC4uNTg4MWQwMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9oYXNoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaGFzaC5weQpAQCAtNTUsMTMgKzU1LDggQEAKICAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICAgcmV0dXJuIHNlbGYgaXMgbm90IG90aGVyCiAKLWNsYXNzIE9ubHlDbXAob2JqZWN0KToKLSAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHJldHVybiBjbXAoaWQoc2VsZiksIGlkKG90aGVyKSkKLQogY2xhc3MgSW5oZXJpdGVkSGFzaFdpdGhFcXVhbGl0eShGaXhlZEhhc2gsIE9ubHlFcXVhbGl0eSk6IHBhc3MKIGNsYXNzIEluaGVyaXRlZEhhc2hXaXRoSW5lcXVhbGl0eShGaXhlZEhhc2gsIE9ubHlJbmVxdWFsaXR5KTogcGFzcwotY2xhc3MgSW5oZXJpdGVkSGFzaFdpdGhDbXAoRml4ZWRIYXNoLCBPbmx5Q21wKTogcGFzcwogCiBjbGFzcyBOb0hhc2gob2JqZWN0KToKICAgICBfX2hhc2hfXyA9IE5vbmUKQEAgLTc0LDcgKzY5LDYgQEAKICAgICBmaXhlZF9leHBlY3RlZCA9IFtGaXhlZEhhc2goKSwKICAgICAgICAgICAgICAgICAgICAgICBJbmhlcml0ZWRIYXNoV2l0aEVxdWFsaXR5KCksCiAgICAgICAgICAgICAgICAgICAgICAgSW5oZXJpdGVkSGFzaFdpdGhJbmVxdWFsaXR5KCksCi0gICAgICAgICAgICAgICAgICAgICAgSW5oZXJpdGVkSGFzaFdpdGhDbXAoKSwKICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgZXJyb3JfZXhwZWN0ZWQgPSBbTm9IYXNoKCksCiAgICAgICAgICAgICAgICAgICAgICAgT25seUVxdWFsaXR5KCksCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5IGIvTGliL3Rlc3QvdGVzdF9oZWFwcS5weQppbmRleCA0ODRhYjQ4Li5lMWU3ZTljIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkKQEAgLTIzNCw5ICsyMzQsOSBAQAogCiBjbGFzcyBDbXBFcnI6CiAgICAgIkR1bW15IGVsZW1lbnQgdGhhdCBhbHdheXMgcmFpc2VzIGFuIGVycm9yIGR1cmluZyBjb21wYXJpc29uIgotICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IKLSAgICBfX2VxX18gPSBfX25lX18gPSBfX2x0X18gPSBfX2xlX18gPSBfX2d0X18gPSBfX2dlX18gPSBfX2NtcF9fCisgICAgX19uZV9fID0gX19sdF9fID0gX19sZV9fID0gX19ndF9fID0gX19nZV9fID0gX19lcV9fCiAKIGRlZiBSKHNlcW4pOgogICAgICdSZWd1bGFyIGdlbmVyYXRvcicKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaG1hYy5weSBiL0xpYi90ZXN0L3Rlc3RfaG1hYy5weQppbmRleCBmN2FjOGVmLi44ZGNiZTdlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2htYWMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9obWFjLnB5CkBAIC0yOTEsNyArMjkxLDcgQEAKICAgICAgICAgIyBUZXN0aW5nIGlmIHRoZSBjb3B5IG1ldGhvZCBjcmVhdGVkIGEgcmVhbCBjb3B5LgogICAgICAgICBoMSA9IGhtYWMuSE1BQyhiImtleSIpCiAgICAgICAgIGgyID0gaDEuY29weSgpCi0gICAgICAgICMgVXNpbmcgaWQoKSBpbiBjYXNlIHNvbWVib2R5IGhhcyBvdmVycmlkZGVuIF9fY21wX18uCisgICAgICAgICMgVXNpbmcgaWQoKSBpbiBjYXNlIHNvbWVib2R5IGhhcyBvdmVycmlkZGVuIF9fZXFfXy9fX25lX18uCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpZChoMSkgIT0gaWQoaDIpLCAiTm8gcmVhbCBjb3B5IG9mIHRoZSBITUFDIGluc3RhbmNlLiIpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpZChoMS5pbm5lcikgIT0gaWQoaDIuaW5uZXIpLAogICAgICAgICAgICAgIk5vIHJlYWwgY29weSBvZiB0aGUgYXR0cmlidXRlICdpbm5lcicuIikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfa3F1ZXVlLnB5IGIvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkKaW5kZXggOTNkZWIxZS4uZWI0ODY1YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkKQEAgLTIyLDYgKzIyLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwga3EuZmlsZW5vKQogCiAgICAgZGVmIHRlc3RfY3JlYXRlX2V2ZW50KHNlbGYpOgorICAgICAgICBmcm9tIG9wZXJhdG9yIGltcG9ydCBsdCwgbGUsIGd0LCBnZQogICAgICAgICBmZCA9IHN5cy5zdGRlcnIuZmlsZW5vKCkKICAgICAgICAgZXYgPSBzZWxlY3Qua2V2ZW50KGZkKQogICAgICAgICBvdGhlciA9IHNlbGVjdC5rZXZlbnQoMTAwMCkKQEAgLTMzLDEyICszNCwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LnVkYXRhLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LCBldikKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChldiwgb3RoZXIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGV2LCBvdGhlciksIC0xKQogICAgICAgICBzZWxmLmFzc2VydF8oZXYgPCBvdGhlcikKICAgICAgICAgc2VsZi5hc3NlcnRfKG90aGVyID49IGV2KQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgZXYsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCBldiwgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXAsIGV2LCAiZXYiKQorICAgICAgICBmb3Igb3AgaW4gbHQsIGxlLCBndCwgZ2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wLCBldiwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3AsIGV2LCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcCwgZXYsICJldiIpCiAKICAgICAgICAgZXYgPSBzZWxlY3Qua2V2ZW50KGZkLCBzZWxlY3QuS1FfRklMVEVSX1dSSVRFKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmlkZW50LCBmZCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbG9uZy5weSBiL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQppbmRleCBjMWY4YjVjLi4yYWNiM2ZhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xvbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9sb25nLnB5CkBAIC02OTcsNyArNjk3LDggQEAKICAgICAgICAgICAgIGRlZiBfY21wX18oc2VsZiwgb3RoZXIpOgogICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBSYXQpOgogICAgICAgICAgICAgICAgICAgICBvdGhlciA9IFJhdChvdGhlcikKLSAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYubiAqIG90aGVyLmQsIHNlbGYuZCAqIG90aGVyLm4pCisgICAgICAgICAgICAgICAgeCwgeSA9IHNlbGYubiAqIG90aGVyLmQsIHNlbGYuZCAqIG90aGVyLm4KKyAgICAgICAgICAgICAgICByZXR1cm4gKHggPiB5KSAtICh4IDwgeSkKICAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbXBfXyhvdGhlcikgPT0gMAogICAgICAgICAgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CkBAIC03MjcsOCArNzI4LDggQEAKICAgICAgICAgICAgIFJ4ID0gUmF0KHgpCiAgICAgICAgICAgICBmb3IgeSBpbiBjYXNlczoKICAgICAgICAgICAgICAgICBSeSA9IFJhdCh5KQotICAgICAgICAgICAgICAgIFJjbXAgPSBjbXAoUngsIFJ5KQotICAgICAgICAgICAgICAgIHh5Y21wID0gY21wKHgsIHkpCisgICAgICAgICAgICAgICAgUmNtcCA9IChSeCA+IFJ5KSAtIChSeCA8IFJ5KQorICAgICAgICAgICAgICAgIHh5Y21wID0gKHggPiB5KSAtICh4IDwgeSkKICAgICAgICAgICAgICAgICBlcShSY21wLCB4eWNtcCwgRnJtKCIlciAlciAlZCAlZCIsIHgsIHksIFJjbXAsIHh5Y21wKSkKICAgICAgICAgICAgICAgICBlcSh4ID09IHksIFJjbXAgPT0gMCwgRnJtKCIlciA9PSAlciAlZCIsIHgsIHksIFJjbXApKQogICAgICAgICAgICAgICAgIGVxKHggIT0geSwgUmNtcCAhPSAwLCBGcm0oIiVyICE9ICVyICVkIiwgeCwgeSwgUmNtcCkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CmluZGV4IDVhODgxOWYuLjE1ZDNjNmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CkBAIC0xMDM2LDE2ICsxMDM2LDYgQEAKICAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgXiBzZXQoWzhdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2V0KFsyLCA0LCA2LCA4XSkpCiAKLSAgICBkZWYgdGVzdF9jbXAoc2VsZik6Ci0gICAgICAgIGEsIGIgPSBzZXQoJ2EnKSwgc2V0KCdiJykKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXAsIGEsIGIpCi0KLSAgICAgICAgIyBJbiBweTNrLCB0aGlzIHdvcmtzIQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgYSwgYSkKLQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgYSwgMTIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCAiYWJjIiwgYSkKLQogIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBjbGFzcyBUZXN0VXBkYXRlT3BzKHVuaXR0ZXN0LlRlc3RDYXNlKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29ydC5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ydC5weQppbmRleCA4YjEwOGQ1Li5hN2FmZTczIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb3J0LnB5CkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICAgICAgICAgIHkgPSB4WzpdCiAgICAgICAgICAgICB5LnJldmVyc2UoKQogICAgICAgICAgICAgcyA9IHhbOl0KLSAgICAgICAgICAgIGNoZWNrKCJyZXZlcnNlZCB2aWEgZnVuY3Rpb24iLCB5LCBzLCBsYW1iZGEgYSwgYjogY21wKGIsIGEpKQorICAgICAgICAgICAgY2hlY2soInJldmVyc2VkIHZpYSBmdW5jdGlvbiIsIHksIHMsIGxhbWJkYSBhLCBiOiAoYj5hKS0oYjxhKSkKIAogICAgICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgICAgICBwcmludCgiICAgIENoZWNraW5nIGFnYWluc3QgYW4gaW5zYW5lIGNvbXBhcmlzb24gZnVuY3Rpb24uIikKQEAgLTE1NywxMyArMTU3LDEzIEBACiAgICAgICAgICAgICBkZWYgbXV0YXRpbmdfY21wKHgsIHkpOgogICAgICAgICAgICAgICAgIEwuYXBwZW5kKDMpCiAgICAgICAgICAgICAgICAgTC5wb3AoKQotICAgICAgICAgICAgICAgIHJldHVybiBjbXAoeCwgeSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHggPiB5KSAtICh4IDwgeSkKICAgICAgICAgICAgIEwgPSBbMSwyXQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgTC5zb3J0LCBrZXk9Q21wVG9LZXkobXV0YXRpbmdfY21wKSkKICAgICAgICAgICAgIGRlZiBtdXRhdGluZ19jbXAoeCwgeSk6CiAgICAgICAgICAgICAgICAgTC5hcHBlbmQoMykKICAgICAgICAgICAgICAgICBkZWwgTFs6XQotICAgICAgICAgICAgICAgIHJldHVybiBjbXAoeCwgeSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHggPiB5KSAtICh4IDwgeSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIEwuc29ydCwga2V5PUNtcFRvS2V5KG11dGF0aW5nX2NtcCkpCiAgICAgICAgICAgICBtZW1vcnl3YXN0ZXIgPSBbbWVtb3J5d2FzdGVyXQogCkBAIC0xNzYsNyArMTc2LDEwIEBACiAgICAgICAgIGNvcHkgPSBkYXRhWzpdCiAgICAgICAgIHJhbmRvbS5zaHVmZmxlKGRhdGEpCiAgICAgICAgIGRhdGEuc29ydChrZXk9c3RyLmxvd2VyKQotICAgICAgICBjb3B5LnNvcnQoa2V5PUNtcFRvS2V5KGxhbWJkYSB4LHk6IGNtcCh4Lmxvd2VyKCksIHkubG93ZXIoKSkpKQorICAgICAgICBkZWYgbXlfY21wKHgsIHkpOgorICAgICAgICAgICAgeGxvd2VyLCB5bG93ZXIgPSB4Lmxvd2VyKCksIHkubG93ZXIoKQorICAgICAgICAgICAgcmV0dXJuICh4bG93ZXIgPiB5bG93ZXIpIC0gKHhsb3dlciA8IHlsb3dlcikKKyAgICAgICAgY29weS5zb3J0KGtleT1DbXBUb0tleShteV9jbXApKQogCiAgICAgZGVmIHRlc3RfYmFkZGVjb3JhdG9yKHNlbGYpOgogICAgICAgICBkYXRhID0gJ1RoZSBxdWljayBCcm93biBmb3ggSnVtcGVkIG92ZXIgVGhlIGxhenkgRG9nJy5zcGxpdCgpCkBAIC0yNDYsOCArMjQ5LDE0IEBACiAgICAgICAgIGRhdGEgPSBbKHJhbmRvbS5yYW5kcmFuZ2UoMTAwKSwgaSkgZm9yIGkgaW4gcmFuZ2UoMjAwKV0KICAgICAgICAgY29weTEgPSBkYXRhWzpdCiAgICAgICAgIGNvcHkyID0gZGF0YVs6XQotICAgICAgICBkYXRhLnNvcnQoa2V5PUNtcFRvS2V5KGxhbWJkYSB4LHk6IGNtcCh4WzBdLHlbMF0pKSwgcmV2ZXJzZT1UcnVlKQotICAgICAgICBjb3B5MS5zb3J0KGtleT1DbXBUb0tleShsYW1iZGEgeCx5OiBjbXAoeVswXSx4WzBdKSkpCisgICAgICAgIGRlZiBteV9jbXAoeCwgeSk6CisgICAgICAgICAgICB4MCwgeTAgPSB4WzBdLCB5WzBdCisgICAgICAgICAgICByZXR1cm4gKHgwID4geTApIC0gKHgwIDwgeTApCisgICAgICAgIGRlZiBteV9jbXBfcmV2ZXJzZWQoeCwgeSk6CisgICAgICAgICAgICB4MCwgeTAgPSB4WzBdLCB5WzBdCisgICAgICAgICAgICByZXR1cm4gKHkwID4geDApIC0gKHkwIDwgeDApCisgICAgICAgIGRhdGEuc29ydChrZXk9Q21wVG9LZXkobXlfY21wKSwgcmV2ZXJzZT1UcnVlKQorICAgICAgICBjb3B5MS5zb3J0KGtleT1DbXBUb0tleShteV9jbXBfcmV2ZXJzZWQpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGNvcHkxKQogICAgICAgICBjb3B5Mi5zb3J0KGtleT1sYW1iZGEgeDogeFswXSwgcmV2ZXJzZT1UcnVlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGNvcHkyKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91bml0dGVzdC5weSBiL0xpYi90ZXN0L3Rlc3RfdW5pdHRlc3QucHkKaW5kZXggOWMxMjIwNS4uMzhjZWI5YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91bml0dGVzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VuaXR0ZXN0LnB5CkBAIC0xMTAzLDcgKzExMDMsNyBAQAogICAgICMgZ2V0VGVzdENhc2VOYW1lcygpIGFuZCBhbGwgdGhlIGxvYWRUZXN0c0Zyb21YKCkgbWV0aG9kcyIKICAgICBkZWYgdGVzdF9zb3J0VGVzdE1ldGhvZHNVc2luZ19fbG9hZFRlc3RzRnJvbVRlc3RDYXNlKHNlbGYpOgogICAgICAgICBkZWYgcmV2ZXJzZWRfY21wKHgsIHkpOgotICAgICAgICAgICAgcmV0dXJuIC1jbXAoeCwgeSkKKyAgICAgICAgICAgIHJldHVybiAtKCh4ID4geSkgLSAoeCA8IHkpKQogCiAgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCkBAIC0xMTE5LDcgKzExMTksNyBAQAogICAgICMgZ2V0VGVzdENhc2VOYW1lcygpIGFuZCBhbGwgdGhlIGxvYWRUZXN0c0Zyb21YKCkgbWV0aG9kcyIKICAgICBkZWYgdGVzdF9zb3J0VGVzdE1ldGhvZHNVc2luZ19fbG9hZFRlc3RzRnJvbU1vZHVsZShzZWxmKToKICAgICAgICAgZGVmIHJldmVyc2VkX2NtcCh4LCB5KToKLSAgICAgICAgICAgIHJldHVybiAtY21wKHgsIHkpCisgICAgICAgICAgICByZXR1cm4gLSgoeCA+IHkpIC0gKHggPCB5KSkKIAogICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCiAgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0xMTM3LDcgKzExMzcsNyBAQAogICAgICMgZ2V0VGVzdENhc2VOYW1lcygpIGFuZCBhbGwgdGhlIGxvYWRUZXN0c0Zyb21YKCkgbWV0aG9kcyIKICAgICBkZWYgdGVzdF9zb3J0VGVzdE1ldGhvZHNVc2luZ19fbG9hZFRlc3RzRnJvbU5hbWUoc2VsZik6CiAgICAgICAgIGRlZiByZXZlcnNlZF9jbXAoeCwgeSk6Ci0gICAgICAgICAgICByZXR1cm4gLWNtcCh4LCB5KQorICAgICAgICAgICAgcmV0dXJuIC0oKHggPiB5KSAtICh4IDwgeSkpCiAKICAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQogICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMTE1NSw3ICsxMTU1LDcgQEAKICAgICAjIGdldFRlc3RDYXNlTmFtZXMoKSBhbmQgYWxsIHRoZSBsb2FkVGVzdHNGcm9tWCgpIG1ldGhvZHMiCiAgICAgZGVmIHRlc3Rfc29ydFRlc3RNZXRob2RzVXNpbmdfX2xvYWRUZXN0c0Zyb21OYW1lcyhzZWxmKToKICAgICAgICAgZGVmIHJldmVyc2VkX2NtcCh4LCB5KToKLSAgICAgICAgICAgIHJldHVybiAtY21wKHgsIHkpCisgICAgICAgICAgICByZXR1cm4gLSgoeCA+IHkpIC0gKHggPCB5KSkKIAogICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCiAgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0xMTc1LDcgKzExNzUsNyBAQAogICAgICMgRG9lcyBpdCBhY3R1YWxseSBhZmZlY3QgZ2V0VGVzdENhc2VOYW1lcygpPwogICAgIGRlZiB0ZXN0X3NvcnRUZXN0TWV0aG9kc1VzaW5nX19nZXRUZXN0Q2FzZU5hbWVzKHNlbGYpOgogICAgICAgICBkZWYgcmV2ZXJzZWRfY21wKHgsIHkpOgotICAgICAgICAgICAgcmV0dXJuIC1jbXAoeCwgeSkKKyAgICAgICAgICAgIHJldHVybiAtKCh4ID4geSkgLSAoeCA8IHkpKQogCiAgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCkBAIC0xMTg4LDkgKzExODgsMTkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIuZ2V0VGVzdENhc2VOYW1lcyhGb28pLCB0ZXN0X25hbWVzKQogCiAgICAgIyAiVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIGJ1aWx0LWluIGNtcCgpIGZ1bmN0aW9uIgorICAgICMgU2luY2UgY21wIGlzIG5vdyBkZWZ1bmN0LCB3ZSBzaW1wbHkgdmVyaWZ5IHRoYXQgdGhlIHJlc3VsdHMKKyAgICAjIG9jY3VyIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgd291bGQgd2l0aCB0aGUgZGVmYXVsdCBzb3J0LgogICAgIGRlZiB0ZXN0X3NvcnRUZXN0TWV0aG9kc1VzaW5nX19kZWZhdWx0X3ZhbHVlKHNlbGYpOgogICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxvYWRlci5zb3J0VGVzdE1ldGhvZHNVc2luZyBpcyBjbXApCisKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0XzIoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0XzMoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6IHBhc3MKKworICAgICAgICB0ZXN0X25hbWVzID0gWyd0ZXN0XzInLCAndGVzdF8zJywgJ3Rlc3RfMSddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmdldFRlc3RDYXNlTmFtZXMoRm9vKSwgc29ydGVkKHRlc3RfbmFtZXMpKQorCiAKICAgICAjICJpdCBjYW4gYmUgc2V0IHRvIE5vbmUgdG8gZGlzYWJsZSB0aGUgc29ydC4iCiAgICAgIwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weSBiL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkKaW5kZXggMzBlZWM3MS4uNWQ0YTBmZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5CkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1MSksIHJlcHIoZDEpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodTIpLCByZXByKGQyKSkKIAotICAgICAgICAjIFRlc3QgX19jbXBfXyBhbmQgX19sZW5fXworICAgICAgICAjIFRlc3QgcmljaCBjb21wYXJpc29uIGFuZCBfX2xlbl9fCiAgICAgICAgIGFsbCA9IFtkMCwgZDEsIGQyLCB1LCB1MCwgdTEsIHUyLCB1dSwgdXUwLCB1dTEsIHV1Ml0KICAgICAgICAgZm9yIGEgaW4gYWxsOgogICAgICAgICAgICAgZm9yIGIgaW4gYWxsOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91dWlkLnB5IGIvTGliL3Rlc3QvdGVzdF91dWlkLnB5CmluZGV4IDVhMzdjMmYuLmNmOWVhODQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXVpZC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3V1aWQucHkKQEAgLTE4MSw3ICsxODEsMTIgQEAKICAgICAgICAgIyBUZXN0IGNvbXBhcmlzb24gb2YgVVVJRHMuCiAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihhc2NlbmRpbmcpKToKICAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKGxlbihhc2NlbmRpbmcpKToKLSAgICAgICAgICAgICAgICBlcXVhbChjbXAoaSwgaiksIGNtcChhc2NlbmRpbmdbaV0sIGFzY2VuZGluZ1tqXSkpCisgICAgICAgICAgICAgICAgZXF1YWwoaSA8IGosIGFzY2VuZGluZ1tpXSA8IGFzY2VuZGluZ1tqXSkKKyAgICAgICAgICAgICAgICBlcXVhbChpIDw9IGosIGFzY2VuZGluZ1tpXSA8PSBhc2NlbmRpbmdbal0pCisgICAgICAgICAgICAgICAgZXF1YWwoaSA9PSBqLCBhc2NlbmRpbmdbaV0gPT0gYXNjZW5kaW5nW2pdKQorICAgICAgICAgICAgICAgIGVxdWFsKGkgPiBqLCBhc2NlbmRpbmdbaV0gPiBhc2NlbmRpbmdbal0pCisgICAgICAgICAgICAgICAgZXF1YWwoaSA+PSBqLCBhc2NlbmRpbmdbaV0gPj0gYXNjZW5kaW5nW2pdKQorICAgICAgICAgICAgICAgIGVxdWFsKGkgIT0gaiwgYXNjZW5kaW5nW2ldICE9IGFzY2VuZGluZ1tqXSkKIAogICAgICAgICAjIFRlc3Qgc29ydGluZyBvZiBVVUlEcyAoYWJvdmUgbGlzdCBpcyBpbiBhc2NlbmRpbmcgb3JkZXIpLgogICAgICAgICByZXNvcnRlZCA9IGFzY2VuZGluZ1s6XQpkaWZmIC0tZ2l0IGEvTGliL3VuaXR0ZXN0LnB5IGIvTGliL3VuaXR0ZXN0LnB5CmluZGV4IGZlYzQxY2EuLmZmYjhhNmMgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC5weQorKysgYi9MaWIvdW5pdHRlc3QucHkKQEAgLTUzOSwxMiArNTM5LDE2IEBACiAgICAgICAgICAgICByZXR1cm4gbXljbXAoc2VsZi5vYmosIG90aGVyLm9iaikgPT0gLTEKICAgICByZXR1cm4gSwogCitkZWYgdGhyZWVfd2F5X2NtcCh4LCB5KToKKyAgICAiIiJSZXR1cm4gLTEgaWYgeCA8IHksIDAgaWYgeCA9PSB5IGFuZCAxIGlmIHggPiB5IiIiCisgICAgcmV0dXJuICh4ID4geSkgLSAoeCA8IHkpCisKIGNsYXNzIFRlc3RMb2FkZXIob2JqZWN0KToKICAgICAiIiJUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIHRlc3RzIGFjY29yZGluZyB0byB2YXJpb3VzCiAgICAgY3JpdGVyaWEgYW5kIHJldHVybmluZyB0aGVtIHdyYXBwZWQgaW4gYSBUZXN0U3VpdGUKICAgICAiIiIKICAgICB0ZXN0TWV0aG9kUHJlZml4ID0gJ3Rlc3QnCi0gICAgc29ydFRlc3RNZXRob2RzVXNpbmcgPSBjbXAKKyAgICBzb3J0VGVzdE1ldGhvZHNVc2luZyA9IHN0YXRpY21ldGhvZCh0aHJlZV93YXlfY21wKQogICAgIHN1aXRlQ2xhc3MgPSBUZXN0U3VpdGUKIAogICAgIGRlZiBsb2FkVGVzdHNGcm9tVGVzdENhc2Uoc2VsZiwgdGVzdENhc2VDbGFzcyk6CmRpZmYgLS1naXQgYS9MaWIveG1sL2RvbS9taW5pZG9tLnB5IGIvTGliL3htbC9kb20vbWluaWRvbS5weQppbmRleCAzMDI1ZWQ3Li40ODlhZTUyIDEwMDY0NAotLS0gYS9MaWIveG1sL2RvbS9taW5pZG9tLnB5CisrKyBiL0xpYi94bWwvZG9tL21pbmlkb20ucHkKQEAgLTUyMCwxMSArNTIwLDI5IEBACiAKICAgICBfX2xlbl9fID0gX2dldF9sZW5ndGgKIAotICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICBkZWYgX2NtcChzZWxmLCBvdGhlcik6CiAgICAgICAgIGlmIHNlbGYuX2F0dHJzIGlzIGdldGF0dHIob3RoZXIsICJfYXR0cnMiLCBOb25lKToKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gY21wKGlkKHNlbGYpLCBpZChvdGhlcikpCisgICAgICAgICAgICByZXR1cm4gKGlkKHNlbGYpID4gaWQob3RoZXIpKSAtIChpZChzZWxmKSA8IGlkKG90aGVyKSkKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA9PSAwCisKKyAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPj0gMAorCisgICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID4gMAorCisgICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDw9IDAKKworICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8IDAKKworICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSAhPSAwCiAKICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgYXR0bmFtZV9vcl90dXBsZSk6CiAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXR0bmFtZV9vcl90dXBsZSwgdHVwbGUpOgpkaWZmIC0tZ2l0IGEvTGliL3htbC9ldHJlZS9FbGVtZW50VHJlZS5weSBiL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkKaW5kZXggNzgyYWY4MS4uY2ZhYzRmNyAxMDA2NDQKLS0tIGEvTGliL3htbC9ldHJlZS9FbGVtZW50VHJlZS5weQorKysgYi9MaWIveG1sL2V0cmVlL0VsZW1lbnRUcmVlLnB5CkBAIC00OTgsMTAgKzQ5OCwzMCBAQAogICAgICAgICByZXR1cm4gc2VsZi50ZXh0CiAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgICByZXR1cm4gaGFzaChzZWxmLnRleHQpCi0gICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBRTmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gY21wKHNlbGYudGV4dCwgb3RoZXIudGV4dCkKLSAgICAgICAgcmV0dXJuIGNtcChzZWxmLnRleHQsIG90aGVyKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGV4dCA8PSBvdGhlci50ZXh0CisgICAgICAgIHJldHVybiBzZWxmLnRleHQgPD0gb3RoZXIKKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgUU5hbWUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGV4dCA8IG90aGVyLnRleHQKKyAgICAgICAgcmV0dXJuIHNlbGYudGV4dCA8IG90aGVyCisgICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFFOYW1lKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRleHQgPj0gb3RoZXIudGV4dAorICAgICAgICByZXR1cm4gc2VsZi50ZXh0ID49IG90aGVyCisgICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFFOYW1lKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRleHQgPiBvdGhlci50ZXh0CisgICAgICAgIHJldHVybiBzZWxmLnRleHQgPiBvdGhlcgorICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBRTmFtZSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ZXh0ID09IG90aGVyLnRleHQKKyAgICAgICAgcmV0dXJuIHNlbGYudGV4dCA9PSBvdGhlcgorICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBRTmFtZSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ZXh0ICE9IG90aGVyLnRleHQKKyAgICAgICAgcmV0dXJuIHNlbGYudGV4dCAhPSBvdGhlcgogCiAjIwogIyBFbGVtZW50VHJlZSB3cmFwcGVyIGNsYXNzLiAgVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGVudGlyZSBlbGVtZW50CmRpZmYgLS1naXQgYS9MaWIveG1scnBjL2NsaWVudC5weSBiL0xpYi94bWxycGMvY2xpZW50LnB5CmluZGV4IGQxOGVmY2UuLmM3NTI2MjEgMTAwNjQ0Ci0tLSBhL0xpYi94bWxycGMvY2xpZW50LnB5CisrKyBiL0xpYi94bWxycGMvY2xpZW50LnB5CkBAIC0zNDksMTAgKzM0OSw2IEBACiAgICAgZGVmIHRpbWV0dXBsZShzZWxmKToKICAgICAgICAgcmV0dXJuIHRpbWUuc3RycHRpbWUoc2VsZi52YWx1ZSwgIiVZJW0lZFQlSDolTTolUyIpCiAKLSAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgIHMsIG8gPSBzZWxmLm1ha2VfY29tcGFyYWJsZShvdGhlcikKLSAgICAgICAgcmV0dXJuIGNtcChzLCBvKQotCiAgICAgIyMKICAgICAjIEdldCBkYXRlL3RpbWUgdmFsdWUuCiAgICAgIwpkaWZmIC0tZ2l0IGEvVG9vbHMvdW5pY29kZS9tYWtldW5pY29kZWRhdGEucHkgYi9Ub29scy91bmljb2RlL21ha2V1bmljb2RlZGF0YS5weQppbmRleCAwYjMyNDEyLi44MzVlOThiIDEwMDY0NAotLS0gYS9Ub29scy91bmljb2RlL21ha2V1bmljb2RlZGF0YS5weQorKysgYi9Ub29scy91bmljb2RlL21ha2V1bmljb2RlZGF0YS5weQpAQCAtNDU3LDE1ICs0NTcsNiBAQAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyB1bmljb2RlIG5hbWUgZGF0YWJhc2UKIAotZGVmIENtcFRvS2V5KG15Y21wKToKLSAgICAnQ29udmVydCBhIGNtcD0gZnVuY3Rpb24gaW50byBhIGtleT0gZnVuY3Rpb24nCi0gICAgY2xhc3MgSyhvYmplY3QpOgotICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgb2JqLCAqYXJncyk6Ci0gICAgICAgICAgICBzZWxmLm9iaiA9IG9iagotICAgICAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKLSAgICAgICAgICAgIHJldHVybiBteWNtcChzZWxmLm9iaiwgb3RoZXIub2JqKSA9PSAtMQotICAgIHJldHVybiBLCi0KIGRlZiBtYWtldW5pY29kZW5hbWUodW5pY29kZSwgdHJhY2UpOgogCiAgICAgRklMRSA9ICJNb2R1bGVzL3VuaWNvZGVuYW1lX2RiLmgiCkBAIC01MDgsMTQgKzQ5OSwxMCBAQAogICAgIHdvcmRsaXN0ID0gbGlzdCh3b3Jkcy5pdGVtcygpKQogCiAgICAgIyBzb3J0IG9uIGZhbGxpbmcgZnJlcXVlbmN5LCB0aGVuIGJ5IG5hbWUKLSAgICBkZWYgY21wd29yZHMoYSxiKToKKyAgICBkZWYgd29yZF9rZXkoYSk6CiAgICAgICAgIGF3b3JkLCBhbGlzdCA9IGEKLSAgICAgICAgYndvcmQsIGJsaXN0ID0gYgotICAgICAgICByID0gLWNtcChsZW4oYWxpc3QpLGxlbihibGlzdCkpCi0gICAgICAgIGlmIHI6Ci0gICAgICAgICAgICByZXR1cm4gcgotICAgICAgICByZXR1cm4gY21wKGF3b3JkLCBid29yZCkKLSAgICB3b3JkbGlzdC5zb3J0KGtleT1DbXBUb0tleShjbXB3b3JkcykpCisgICAgICAgIHJldHVybiAtbGVuKGFsaXN0KSwgYXdvcmQKKyAgICB3b3JkbGlzdC5zb3J0KGtleT13b3JkX2tleSkKIAogICAgICMgZmlndXJlIG91dCBob3cgbWFueSBwaHJhc2Vib29rIGVzY2FwZXMgd2UgbmVlZAogICAgIGVzY2FwZXMgPSAwCg==