ZGlmZiAtLWdpdCBhL3NyYy9Eb3RQdWxzYXIvQWJzdHJhY3Rpb25zL0lQdWxzYXJDbGllbnRCdWlsZGVyLmNzIGIvc3JjL0RvdFB1bHNhci9BYnN0cmFjdGlvbnMvSVB1bHNhckNsaWVudEJ1aWxkZXIuY3MKaW5kZXggN2VmMDc5ZS4uZWEyYWI1YiAxMDA2NDQKLS0tIGEvc3JjL0RvdFB1bHNhci9BYnN0cmFjdGlvbnMvSVB1bHNhckNsaWVudEJ1aWxkZXIuY3MKKysrIGIvc3JjL0RvdFB1bHNhci9BYnN0cmFjdGlvbnMvSVB1bHNhckNsaWVudEJ1aWxkZXIuY3MKQEAgLTE2LDYgKzE2LDcgQEAKIAogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5YNTA5Q2VydGlmaWNhdGVzOwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKIAogLy8vIDxzdW1tYXJ5PgogLy8vIEEgcHVsc2FyIGNsaWVudCBidWlsZGluZyBhYnN0cmFjdGlvbi4KQEAgLTMzLDYgKzM0LDExIEBACiAgICAgSVB1bHNhckNsaWVudEJ1aWxkZXIgQXV0aGVudGljYXRlVXNpbmdUb2tlbihzdHJpbmcgdG9rZW4pOwogCiAgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBBdXRoZW50aWNhdGUgdXNpbmcgYSAoSlNPTiBXZWIpIHRva2VuIGZhY3RvcnkuIFRoaXMgaXMgb3B0aW9uYWwuCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBJUHVsc2FyQ2xpZW50QnVpbGRlciBBdXRoZW50aWNhdGVVc2luZ1Rva2VuKEZ1bmM8VGFzazxzdHJpbmc+PiB0b2tlbkZhY3RvcnkpOworCisgICAgLy8vIDxzdW1tYXJ5PgogICAgIC8vLyBTZXQgY29ubmVjdGlvbiBlbmNyeXB0aW9uIHBvbGljeS4gVGhlIGRlZmF1bHQgaXMgJ0VuZm9yY2VVbmVuY3J5cHRlZCcgaWYgdGhlIFNlcnZpY2VVcmwgc2NoZW1lIGlzICdwdWxzYXInIGFuZCAnRW5mb3JjZUVuY3J5cHRlZCcgaWYgaXQncyAncHVsc2FyK3NzbCcuCiAgICAgLy8vIDwvc3VtbWFyeT4KICAgICBJUHVsc2FyQ2xpZW50QnVpbGRlciBDb25uZWN0aW9uU2VjdXJpdHkoRW5jcnlwdGlvblBvbGljeSBlbmNyeXB0aW9uUG9saWN5KTsKZGlmZiAtLWdpdCBhL3NyYy9Eb3RQdWxzYXIvSW50ZXJuYWwvQ29ubmVjdGlvbi5jcyBiL3NyYy9Eb3RQdWxzYXIvSW50ZXJuYWwvQ29ubmVjdGlvbi5jcwppbmRleCAxZWU3MmUzLi42MGM2NDMzIDEwMDY0NAotLS0gYS9zcmMvRG90UHVsc2FyL0ludGVybmFsL0Nvbm5lY3Rpb24uY3MKKysrIGIvc3JjL0RvdFB1bHNhci9JbnRlcm5hbC9Db25uZWN0aW9uLmNzCkBAIC0yMCw2ICsyMCw4IEBACiB1c2luZyBQdWxzYXJBcGk7CiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQnVmZmVyczsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLlRocmVhZGluZzsKIHVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CiAKQEAgLTI5LDE0ICszMSwxNiBAQAogICAgIHByaXZhdGUgcmVhZG9ubHkgQ2hhbm5lbE1hbmFnZXIgX2NoYW5uZWxNYW5hZ2VyOwogICAgIHByaXZhdGUgcmVhZG9ubHkgUGluZ1BvbmdIYW5kbGVyIF9waW5nUG9uZ0hhbmRsZXI7CiAgICAgcHJpdmF0ZSByZWFkb25seSBJUHVsc2FyU3RyZWFtIF9zdHJlYW07CisgICAgcHJpdmF0ZSByZWFkb25seSBGdW5jPFRhc2s8c3RyaW5nPj4/IF9hY2Nlc3NUb2tlbkZhY3Rvcnk7CiAgICAgcHJpdmF0ZSBpbnQgX2lzRGlzcG9zZWQ7CiAKLSAgICBwdWJsaWMgQ29ubmVjdGlvbihJUHVsc2FyU3RyZWFtIHN0cmVhbSwgVGltZVNwYW4ga2VlcEFsaXZlSW50ZXJ2YWwpCisgICAgcHVibGljIENvbm5lY3Rpb24oSVB1bHNhclN0cmVhbSBzdHJlYW0sIFRpbWVTcGFuIGtlZXBBbGl2ZUludGVydmFsLCBGdW5jPFRhc2s8c3RyaW5nPj4/IGFjY2Vzc1Rva2VuRmFjdG9yeSkKICAgICB7CiAgICAgICAgIF9sb2NrID0gbmV3IEFzeW5jTG9jaygpOwogICAgICAgICBfY2hhbm5lbE1hbmFnZXIgPSBuZXcgQ2hhbm5lbE1hbmFnZXIoKTsKICAgICAgICAgX3BpbmdQb25nSGFuZGxlciA9IG5ldyBQaW5nUG9uZ0hhbmRsZXIodGhpcywga2VlcEFsaXZlSW50ZXJ2YWwpOwogICAgICAgICBfc3RyZWFtID0gc3RyZWFtOworICAgICAgICBfYWNjZXNzVG9rZW5GYWN0b3J5ID0gYWNjZXNzVG9rZW5GYWN0b3J5OwogICAgIH0KIAogICAgIHB1YmxpYyBhc3luYyBWYWx1ZVRhc2s8Ym9vbD4gSGFzQ2hhbm5lbHMoQ2FuY2VsbGF0aW9uVG9rZW4gY2FuY2VsbGF0aW9uVG9rZW4pCkBAIC04MSw2ICs4NSw5IEBACiAgICAgICAgIHJldHVybiBhd2FpdCByZXNwb25zZVRhc2suQ29uZmlndXJlQXdhaXQoZmFsc2UpOwogICAgIH0KIAorICAgIHByaXZhdGUgVGFzayBTZW5kKENvbW1hbmRBdXRoUmVzcG9uc2UgYXV0aFJlc3BvbnNlLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKKyAgICAgICAgPT4gU2VuZChhdXRoUmVzcG9uc2UuQXNCYXNlQ29tbWFuZCgpLCBjYW5jZWxsYXRpb25Ub2tlbik7CisKICAgICBwdWJsaWMgVGFzayBTZW5kKENvbW1hbmRQaW5nIGNvbW1hbmQsIENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQogICAgICAgICA9PiBTZW5kKGNvbW1hbmQuQXNCYXNlQ29tbWFuZCgpLCBjYW5jZWxsYXRpb25Ub2tlbik7CiAKQEAgLTI2OCwxMyArMjc1LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgYXN5bmMgVGFzayBQcm9jZXNzSW5jb21taW5nRnJhbWVzKCkKKyAgICBwdWJsaWMgYXN5bmMgVGFzayBQcm9jZXNzSW5jb21taW5nRnJhbWVzKENhbmNlbGxhdGlvblRva2VuIGNhbmNlbGxhdGlvblRva2VuKQogICAgIHsKICAgICAgICAgYXdhaXQgVGFzay5ZaWVsZCgpOwogCiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBhd2FpdCBmb3JlYWNoICh2YXIgZnJhbWUgaW4gX3N0cmVhbS5GcmFtZXMoKSkKKyAgICAgICAgICAgIGF3YWl0IGZvcmVhY2ggKHZhciBmcmFtZSBpbiBfc3RyZWFtLkZyYW1lcyhjYW5jZWxsYXRpb25Ub2tlbikpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdmFyIGNvbW1hbmRTaXplID0gZnJhbWUuUmVhZFVJbnQzMigwLCB0cnVlKTsKICAgICAgICAgICAgICAgICB2YXIgY29tbWFuZCA9IFNlcmlhbGl6ZXIuRGVzZXJpYWxpemU8QmFzZUNvbW1hbmQ+KGZyYW1lLlNsaWNlKDQsIGNvbW1hbmRTaXplKSk7CkBAIC0yODUsNyArMjkyLDE4IEBACiAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQuQ29tbWFuZFR5cGUgPT0gQmFzZUNvbW1hbmQuVHlwZS5NZXNzYWdlKQogICAgICAgICAgICAgICAgICAgICBfY2hhbm5lbE1hbmFnZXIuSW5jb21pbmcoY29tbWFuZC5NZXNzYWdlLCBuZXcgUmVhZE9ubHlTZXF1ZW5jZTxieXRlPihmcmFtZS5TbGljZShjb21tYW5kU2l6ZSArIDQpLlRvQXJyYXkoKSkpOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgX2NoYW5uZWxNYW5hZ2VyLkluY29taW5nKGNvbW1hbmQpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9hY2Nlc3NUb2tlbkZhY3RvcnkgIT0gbnVsbCAmJiBjb21tYW5kLkNvbW1hbmRUeXBlID09IEJhc2VDb21tYW5kLlR5cGUuQXV0aENoYWxsZW5nZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gYXdhaXQgX2FjY2Vzc1Rva2VuRmFjdG9yeS5HZXRUb2tlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgU2VuZChuZXcgQ29tbWFuZEF1dGhSZXNwb25zZSB7IFJlc3BvbnNlID0gbmV3IEF1dGhEYXRhIHsgRGF0YSA9IEVuY29kaW5nLlVURjguR2V0Qnl0ZXModG9rZW4pLCBBdXRoTWV0aG9kTmFtZSA9ICJ0b2tlbiIgfSB9LCBjYW5jZWxsYXRpb25Ub2tlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBEb3RQdWxzYXJFdmVudFNvdXJjZS5Mb2cuVG9rZW5SZWZyZXNoZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jaGFubmVsTWFuYWdlci5JbmNvbWluZyhjb21tYW5kKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjYXRjaApkaWZmIC0tZ2l0IGEvc3JjL0RvdFB1bHNhci9JbnRlcm5hbC9Db25uZWN0aW9uUG9vbC5jcyBiL3NyYy9Eb3RQdWxzYXIvSW50ZXJuYWwvQ29ubmVjdGlvblBvb2wuY3MKaW5kZXggMTRhYjg1Zi4uOWU1ZGMyZiAxMDA2NDQKLS0tIGEvc3JjL0RvdFB1bHNhci9JbnRlcm5hbC9Db25uZWN0aW9uUG9vbC5jcworKysgYi9zcmMvRG90UHVsc2FyL0ludGVybmFsL0Nvbm5lY3Rpb25Qb29sLmNzCkBAIC0yMSw2ICsyMSw3IEBACiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuQ29uY3VycmVudDsKIHVzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uVGhyZWFkaW5nOwogdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKIApAQCAtMzYsNiArMzcsOCBAQAogICAgIHByaXZhdGUgcmVhZG9ubHkgVGFzayBfY2xvc2VJbmFjdGl2ZUNvbm5lY3Rpb25zOwogICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nPyBfbGlzdGVuZXJOYW1lOwogICAgIHByaXZhdGUgcmVhZG9ubHkgVGltZVNwYW4gX2tlZXBBbGl2ZUludGVydmFsOworICAgIHByaXZhdGUgcmVhZG9ubHkgSUV4ZWN1dGUgX2V4ZWN1dG9yOworICAgIHByaXZhdGUgcmVhZG9ubHkgRnVuYzxUYXNrPHN0cmluZz4+PyBfYWNjZXNzVG9rZW5GYWN0b3J5OwogCiAgICAgcHVibGljIENvbm5lY3Rpb25Qb29sKAogICAgICAgICBDb21tYW5kQ29ubmVjdCBjb21tYW5kQ29ubmVjdCwKQEAgLTQ0LDcgKzQ3LDkgQEAKICAgICAgICAgRW5jcnlwdGlvblBvbGljeSBlbmNyeXB0aW9uUG9saWN5LAogICAgICAgICBUaW1lU3BhbiBjbG9zZUluYWN0aXZlQ29ubmVjdGlvbnNJbnRlcnZhbCwKICAgICAgICAgc3RyaW5nPyBsaXN0ZW5lck5hbWUsCi0gICAgICAgIFRpbWVTcGFuIGtlZXBBbGl2ZUludGVydmFsKQorICAgICAgICBUaW1lU3BhbiBrZWVwQWxpdmVJbnRlcnZhbCwKKyAgICAgICAgSUV4ZWN1dGUgZXhlY3V0b3IsCisgICAgICAgIEZ1bmM8VGFzazxzdHJpbmc+Pj8gYWNjZXNzVG9rZW5GYWN0b3J5KQogICAgIHsKICAgICAgICAgX2xvY2sgPSBuZXcgQXN5bmNMb2NrKCk7CiAgICAgICAgIF9jb21tYW5kQ29ubmVjdCA9IGNvbW1hbmRDb25uZWN0OwpAQCAtNTYsNiArNjEsOCBAQAogICAgICAgICBfY2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UgPSBuZXcgQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTsKICAgICAgICAgX2Nsb3NlSW5hY3RpdmVDb25uZWN0aW9ucyA9IENsb3NlSW5hY3RpdmVDb25uZWN0aW9ucyhjbG9zZUluYWN0aXZlQ29ubmVjdGlvbnNJbnRlcnZhbCwgX2NhbmNlbGxhdGlvblRva2VuU291cmNlLlRva2VuKTsKICAgICAgICAgX2tlZXBBbGl2ZUludGVydmFsID0ga2VlcEFsaXZlSW50ZXJ2YWw7CisgICAgICAgIF9leGVjdXRvciA9IGV4ZWN1dG9yOworICAgICAgICBfYWNjZXNzVG9rZW5GYWN0b3J5ID0gYWNjZXNzVG9rZW5GYWN0b3J5OwogICAgIH0KIAogICAgIHB1YmxpYyBhc3luYyBWYWx1ZVRhc2sgRGlzcG9zZUFzeW5jKCkKQEAgLTEwNSw2ICsxMTIsNyBAQAogCiAgICAgICAgICAgICBpZiAocmVzcG9uc2UuTG9va3VwVG9waWNSZXNwb25zZS5Qcm94eVRocm91Z2hTZXJ2aWNlVXJsKQogICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uRGlzcG9zZUFzeW5jKCk7CiAgICAgICAgICAgICAgICAgdmFyIHVybCA9IG5ldyBQdWxzYXJVcmwocGh5c2ljYWxVcmwsIGxvb2t1cFJlc3BvbnNlU2VydmljZVVybCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IEdldENvbm5lY3Rpb24odXJsLCBjYW5jZWxsYXRpb25Ub2tlbikuQ29uZmlndXJlQXdhaXQoZmFsc2UpOwogICAgICAgICAgICAgfQpAQCAtMTU3LDE0ICsxNjUsMjEgQEAKICAgICBwcml2YXRlIGFzeW5jIFRhc2s8Q29ubmVjdGlvbj4gRXN0YWJsaXNoTmV3Q29ubmVjdGlvbihQdWxzYXJVcmwgdXJsLCBDYW5jZWxsYXRpb25Ub2tlbiBjYW5jZWxsYXRpb25Ub2tlbikKICAgICB7CiAgICAgICAgIHZhciBzdHJlYW0gPSBhd2FpdCBfY29ubmVjdG9yLkNvbm5lY3QodXJsLlBoeXNpY2FsKS5Db25maWd1cmVBd2FpdChmYWxzZSk7Ci0gICAgICAgIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24obmV3IFB1bHNhclN0cmVhbShzdHJlYW0pLCBfa2VlcEFsaXZlSW50ZXJ2YWwpOworICAgICAgICB2YXIgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKG5ldyBQdWxzYXJTdHJlYW0oc3RyZWFtKSwgX2tlZXBBbGl2ZUludGVydmFsLCBfYWNjZXNzVG9rZW5GYWN0b3J5KTsKICAgICAgICAgRG90UHVsc2FyRXZlbnRTb3VyY2UuTG9nLkNvbm5lY3Rpb25DcmVhdGVkKCk7CiAgICAgICAgIF9jb25uZWN0aW9uc1t1cmxdID0gY29ubmVjdGlvbjsKLSAgICAgICAgXyA9IGNvbm5lY3Rpb24uUHJvY2Vzc0luY29tbWluZ0ZyYW1lcygpLkNvbnRpbnVlV2l0aCh0ID0+IERpc3Bvc2VDb25uZWN0aW9uKHVybCkpOworICAgICAgICBfID0gY29ubmVjdGlvbi5Qcm9jZXNzSW5jb21taW5nRnJhbWVzKGNhbmNlbGxhdGlvblRva2VuKS5Db250aW51ZVdpdGgodCA9PiBEaXNwb3NlQ29ubmVjdGlvbih1cmwpKTsKICAgICAgICAgdmFyIGNvbW1hbmRDb25uZWN0ID0gX2NvbW1hbmRDb25uZWN0OwogCisgICAgICAgIGlmIChfYWNjZXNzVG9rZW5GYWN0b3J5ICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciB0b2tlbiA9IGF3YWl0IF9hY2Nlc3NUb2tlbkZhY3RvcnkuR2V0VG9rZW4oX2V4ZWN1dG9yKTsKKyAgICAgICAgICAgIGNvbW1hbmRDb25uZWN0LkF1dGhNZXRob2ROYW1lID0gInRva2VuIjsKKyAgICAgICAgICAgIGNvbW1hbmRDb25uZWN0LkF1dGhEYXRhID0gRW5jb2RpbmcuVVRGOC5HZXRCeXRlcyh0b2tlbik7CisgICAgICAgIH0KKwogICAgICAgICBpZiAodXJsLlByb3h5VGhyb3VnaFNlcnZpY2VVcmwpCi0gICAgICAgICAgICBjb21tYW5kQ29ubmVjdCA9IFdpdGhQcm94eVRvQnJva2VyKF9jb21tYW5kQ29ubmVjdCwgdXJsLkxvZ2ljYWwpOworICAgICAgICAgICAgY29tbWFuZENvbm5lY3QgPSBXaXRoUHJveHlUb0Jyb2tlcihjb21tYW5kQ29ubmVjdCwgdXJsLkxvZ2ljYWwpOwogCiAgICAgICAgIHZhciByZXNwb25zZSA9IGF3YWl0IGNvbm5lY3Rpb24uU2VuZChjb21tYW5kQ29ubmVjdCwgY2FuY2VsbGF0aW9uVG9rZW4pLkNvbmZpZ3VyZUF3YWl0KGZhbHNlKTsKICAgICAgICAgcmVzcG9uc2UuRXhwZWN0KEJhc2VDb21tYW5kLlR5cGUuQ29ubmVjdGVkKTsKQEAgLTE4NCwxNSArMTk5LDE2IEBACiAgICAgewogICAgICAgICByZXR1cm4gbmV3IENvbW1hbmRDb25uZWN0CiAgICAgICAgIHsKLSAgICAgICAgICAgIEF1dGhEYXRhID0gY29tbWFuZENvbm5lY3QuQXV0aERhdGEsCi0gICAgICAgICAgICBBdXRoTWV0aG9kID0gY29tbWFuZENvbm5lY3QuQXV0aE1ldGhvZCwKLSAgICAgICAgICAgIEF1dGhNZXRob2ROYW1lID0gY29tbWFuZENvbm5lY3QuQXV0aE1ldGhvZE5hbWUsCisgICAgICAgICAgICBBdXRoRGF0YSA9IGNvbW1hbmRDb25uZWN0LlNob3VsZFNlcmlhbGl6ZUF1dGhEYXRhKCkgPyBjb21tYW5kQ29ubmVjdC5BdXRoRGF0YSA6IG51bGwsCisgICAgICAgICAgICBBdXRoTWV0aG9kID0gY29tbWFuZENvbm5lY3QuU2hvdWxkU2VyaWFsaXplQXV0aE1ldGhvZCgpID8gY29tbWFuZENvbm5lY3QuQXV0aE1ldGhvZCA6IEF1dGhNZXRob2QuQXV0aE1ldGhvZE5vbmUsCisgICAgICAgICAgICBBdXRoTWV0aG9kTmFtZSA9IGNvbW1hbmRDb25uZWN0LlNob3VsZFNlcmlhbGl6ZUF1dGhNZXRob2ROYW1lKCkgPyBjb21tYW5kQ29ubmVjdC5BdXRoTWV0aG9kTmFtZSA6IG51bGwsCiAgICAgICAgICAgICBDbGllbnRWZXJzaW9uID0gY29tbWFuZENvbm5lY3QuQ2xpZW50VmVyc2lvbiwKLSAgICAgICAgICAgIE9yaWdpbmFsUHJpbmNpcGFsID0gY29tbWFuZENvbm5lY3QuT3JpZ2luYWxQcmluY2lwYWwsCisgICAgICAgICAgICBPcmlnaW5hbFByaW5jaXBhbCA9IGNvbW1hbmRDb25uZWN0LlNob3VsZFNlcmlhbGl6ZU9yaWdpbmFsUHJpbmNpcGFsKCkgPyBjb21tYW5kQ29ubmVjdC5PcmlnaW5hbFByaW5jaXBhbCA6IG51bGwsCiAgICAgICAgICAgICBQcm90b2NvbFZlcnNpb24gPSBjb21tYW5kQ29ubmVjdC5Qcm90b2NvbFZlcnNpb24sCi0gICAgICAgICAgICBPcmlnaW5hbEF1dGhEYXRhID0gY29tbWFuZENvbm5lY3QuT3JpZ2luYWxBdXRoRGF0YSwKLSAgICAgICAgICAgIE9yaWdpbmFsQXV0aE1ldGhvZCA9IGNvbW1hbmRDb25uZWN0Lk9yaWdpbmFsQXV0aE1ldGhvZCwKLSAgICAgICAgICAgIFByb3h5VG9Ccm9rZXJVcmwgPSAkIntsb2dpY2FsVXJsLkhvc3R9Ontsb2dpY2FsVXJsLlBvcnR9IgorICAgICAgICAgICAgT3JpZ2luYWxBdXRoRGF0YSA9IGNvbW1hbmRDb25uZWN0LlNob3VsZFNlcmlhbGl6ZU9yaWdpbmFsQXV0aERhdGEoKSA/IGNvbW1hbmRDb25uZWN0Lk9yaWdpbmFsQXV0aERhdGEgOiBudWxsLAorICAgICAgICAgICAgT3JpZ2luYWxBdXRoTWV0aG9kID0gY29tbWFuZENvbm5lY3QuU2hvdWxkU2VyaWFsaXplT3JpZ2luYWxBdXRoTWV0aG9kKCkgPyBjb21tYW5kQ29ubmVjdC5PcmlnaW5hbEF1dGhNZXRob2QgOiBudWxsLAorICAgICAgICAgICAgUHJveHlUb0Jyb2tlclVybCA9ICQie2xvZ2ljYWxVcmwuSG9zdH06e2xvZ2ljYWxVcmwuUG9ydH0iLAorICAgICAgICAgICAgRmVhdHVyZUZsYWdzID0gY29tbWFuZENvbm5lY3QuRmVhdHVyZUZsYWdzCiAgICAgICAgIH07CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvRG90UHVsc2FyL0ludGVybmFsL0RlZmF1bHRFeGNlcHRpb25IYW5kbGVyLmNzIGIvc3JjL0RvdFB1bHNhci9JbnRlcm5hbC9EZWZhdWx0RXhjZXB0aW9uSGFuZGxlci5jcwppbmRleCBhNDJlZWVmLi4wMTkzNDBiIDEwMDY0NAotLS0gYS9zcmMvRG90UHVsc2FyL0ludGVybmFsL0RlZmF1bHRFeGNlcHRpb25IYW5kbGVyLmNzCisrKyBiL3NyYy9Eb3RQdWxzYXIvSW50ZXJuYWwvRGVmYXVsdEV4Y2VwdGlvbkhhbmRsZXIuY3MKQEAgLTYyLDYgKzYyLDcgQEAKICAgICAgICAgICAgICAgICBTb2NrZXRFcnJvci5OZXR3b3JrVW5yZWFjaGFibGUgPT4gRmF1bHRBY3Rpb24uUmV0aHJvdywKICAgICAgICAgICAgICAgICBfID0+IEZhdWx0QWN0aW9uLlJldHJ5CiAgICAgICAgICAgICB9LAorICAgICAgICAgICAgVG9rZW5GYWN0b3J5RmFpbGVkRXhjZXB0aW9uID0+IEZhdWx0QWN0aW9uLlJldHJ5LAogICAgICAgICAgICAgXyA9PiBGYXVsdEFjdGlvbi5SZXRocm93CiAgICAgICAgIH07CiB9CmRpZmYgLS1naXQgYS9zcmMvRG90UHVsc2FyL0ludGVybmFsL0RvdFB1bHNhckV2ZW50U291cmNlLmNzIGIvc3JjL0RvdFB1bHNhci9JbnRlcm5hbC9Eb3RQdWxzYXJFdmVudFNvdXJjZS5jcwppbmRleCA1NTQ3YjA3Li5hYWNjYmM0IDEwMDY0NAotLS0gYS9zcmMvRG90UHVsc2FyL0ludGVybmFsL0RvdFB1bHNhckV2ZW50U291cmNlLmNzCisrKyBiL3NyYy9Eb3RQdWxzYXIvSW50ZXJuYWwvRG90UHVsc2FyRXZlbnRTb3VyY2UuY3MKQEAgLTM4LDYgKzM4LDEwIEBACiAgICAgcHVibGljIHZvaWQgUmVhZGVyQ3JlYXRlZCgpIHsgfQogCiAgICAgcHVibGljIHZvaWQgUmVhZGVyRGlzcG9zZWQoKSB7IH0KKworICAgIHB1YmxpYyB2b2lkIFRva2VuUmVmcmVzaGVkKCkgeyB9CisKKyAgICBwdWJsaWMgbG9uZyBUb2tlblJlZnJlc2hDb3VudCA9PiAwOwogfQogCiAjZWxzZQpAQCAtNzYsMTEgKzgwLDE1IEBACiAKICAgICBwcml2YXRlIFBvbGxpbmdDb3VudGVyPyBfY3VycmVudFJlYWRlcnNDb3VudGVyOwogICAgIHByaXZhdGUgbG9uZyBfY3VycmVudFJlYWRlcnM7CisKKyAgICBwcml2YXRlIFBvbGxpbmdDb3VudGVyPyBfdG9rZW5SZWZyZXNoQ291bnRlcjsKKyAgICBwcml2YXRlIGxvbmcgX3RvdGFsVG9rZW5SZWZyZXNoZXM7CiAjcHJhZ21hIHdhcm5pbmcgcmVzdG9yZSBJREUwMDUyIC8vIFJlbW92ZSB1bnJlYWQgcHJpdmF0ZSBtZW1iZXJzCiAKICAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERvdFB1bHNhckV2ZW50U291cmNlIExvZyA9IG5ldygpOwogCiAgICAgcHVibGljIERvdFB1bHNhckV2ZW50U291cmNlKCkgOiBiYXNlKCJEb3RQdWxzYXIiKSB7IH0KKyAgICBwdWJsaWMgbG9uZyBUb2tlblJlZnJlc2hDb3VudCA9PiBfdG90YWxUb2tlblJlZnJlc2hlczsKIAogICAgIHB1YmxpYyB2b2lkIENsaWVudENyZWF0ZWQoKQogICAgIHsKQEAgLTEzNyw2ICsxNDUsMTEgQEAKICAgICAgICAgSW50ZXJsb2NrZWQuRGVjcmVtZW50KHJlZiBfY3VycmVudFJlYWRlcnMpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIFRva2VuUmVmcmVzaGVkKCkKKyAgICB7CisgICAgICAgIEludGVybG9ja2VkLkluY3JlbWVudChyZWYgX3RvdGFsVG9rZW5SZWZyZXNoZXMpOworICAgIH0KKwogICAgIHByb3RlY3RlZCBvdmVycmlkZSB2b2lkIE9uRXZlbnRDb21tYW5kKEV2ZW50Q29tbWFuZEV2ZW50QXJncyBjb21tYW5kKQogICAgIHsKICAgICAgICAgaWYgKGNvbW1hbmQuQ29tbWFuZCAhPSBFdmVudENvbW1hbmQuRW5hYmxlKQpAQCAtMTkxLDYgKzIwNCwxMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9ICJDdXJyZW50IG51bWJlciBvZiByZWFkZXJzIgogICAgICAgICB9OworCisgICAgICAgIF90b2tlblJlZnJlc2hDb3VudGVyID8/PSBuZXcgUG9sbGluZ0NvdW50ZXIoInRvdGFsLXRva2VuLXJlZnJlc2hlcyIsIHRoaXMsICgpID0+IFZvbGF0aWxlLlJlYWQocmVmIF90b3RhbFRva2VuUmVmcmVzaGVzKSkKKyAgICAgICAgeworICAgICAgICAgICAgRGlzcGxheU5hbWUgPSAiTnVtYmVyIG9mIHRpbWVzIHRva2VuIHdhcyByZWZyZXNoZWQiCisgICAgICAgIH07CiAgICAgfQogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvRG90UHVsc2FyL0ludGVybmFsL0V4Y2VwdGlvbnMvVG9rZW5GYWN0b3J5RmFpbGVkRXhjZXB0aW9uLmNzIGIvc3JjL0RvdFB1bHNhci9JbnRlcm5hbC9FeGNlcHRpb25zL1Rva2VuRmFjdG9yeUZhaWxlZEV4Y2VwdGlvbi5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGVlMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0RvdFB1bHNhci9JbnRlcm5hbC9FeGNlcHRpb25zL1Rva2VuRmFjdG9yeUZhaWxlZEV4Y2VwdGlvbi5jcwpAQCAtMCwwICsxLDEwIEBACituYW1lc3BhY2UgRG90UHVsc2FyLkludGVybmFsLkV4Y2VwdGlvbnM7CisKK3VzaW5nIFN5c3RlbTsKKworcHVibGljIGNsYXNzIFRva2VuRmFjdG9yeUZhaWxlZEV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgoreworICAgIHB1YmxpYyBUb2tlbkZhY3RvcnlGYWlsZWRFeGNlcHRpb24oRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKSA6IGJhc2UoIkV4Y2VwdGlvbiB3aGVuIHRyeWluZyB0byBmZXRjaCB0b2tlbiBmcm9tIHRva2VuIGZhY3RvcnkiLCBpbm5lckV4Y2VwdGlvbikKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0RvdFB1bHNhci9JbnRlcm5hbC9FeHRlbnNpb25zL0NvbW1hbmRFeHRlbnNpb25zLmNzIGIvc3JjL0RvdFB1bHNhci9JbnRlcm5hbC9FeHRlbnNpb25zL0NvbW1hbmRFeHRlbnNpb25zLmNzCmluZGV4IGExN2UzMTMuLjE4NTMzOTggMTAwNjQ0Ci0tLSBhL3NyYy9Eb3RQdWxzYXIvSW50ZXJuYWwvRXh0ZW5zaW9ucy9Db21tYW5kRXh0ZW5zaW9ucy5jcworKysgYi9zcmMvRG90UHVsc2FyL0ludGVybmFsL0V4dGVuc2lvbnMvQ29tbWFuZEV4dGVuc2lvbnMuY3MKQEAgLTEwMCw2ICsxMDAsMTMgQEAKICAgICAgICAgICAgIFBpbmcgPSBjb21tYW5kCiAgICAgICAgIH07CiAKKyAgICBwdWJsaWMgc3RhdGljIEJhc2VDb21tYW5kIEFzQmFzZUNvbW1hbmQodGhpcyBDb21tYW5kQXV0aFJlc3BvbnNlIGNvbW1hbmQpCisgICAgICAgID0+IG5ldygpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbW1hbmRUeXBlID0gQmFzZUNvbW1hbmQuVHlwZS5BdXRoUmVzcG9uc2UsCisgICAgICAgICAgICBBdXRoUmVzcG9uc2UgPSBjb21tYW5kCisgICAgICAgIH07CisKICAgICBwdWJsaWMgc3RhdGljIEJhc2VDb21tYW5kIEFzQmFzZUNvbW1hbmQodGhpcyBDb21tYW5kUG9uZyBjb21tYW5kKQogICAgICAgICA9PiBuZXcoKQogICAgICAgICB7CmRpZmYgLS1naXQgYS9zcmMvRG90UHVsc2FyL0ludGVybmFsL1B1bHNhckNsaWVudEJ1aWxkZXIuY3MgYi9zcmMvRG90UHVsc2FyL0ludGVybmFsL1B1bHNhckNsaWVudEJ1aWxkZXIuY3MKaW5kZXggZmEwNmUwNC4uZGRkMWE1MiAxMDA2NDQKLS0tIGEvc3JjL0RvdFB1bHNhci9JbnRlcm5hbC9QdWxzYXJDbGllbnRCdWlsZGVyLmNzCisrKyBiL3NyYy9Eb3RQdWxzYXIvSW50ZXJuYWwvUHVsc2FyQ2xpZW50QnVpbGRlci5jcwpAQCAtMTQsNiArMTQsNyBAQAogCiBuYW1lc3BhY2UgRG90UHVsc2FyLkludGVybmFsOwogCit1c2luZyBBYnN0cmFjdGlvbnM7CiB1c2luZyBEb3RQdWxzYXIuQWJzdHJhY3Rpb25zOwogdXNpbmcgRG90UHVsc2FyLkV4Y2VwdGlvbnM7CiB1c2luZyBQdWxzYXJBcGk7CkBAIC0yMSw2ICsyMiw3IEBACiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuWDUwOUNlcnRpZmljYXRlczsKIHVzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKIAogcHVibGljIHNlYWxlZCBjbGFzcyBQdWxzYXJDbGllbnRCdWlsZGVyIDogSVB1bHNhckNsaWVudEJ1aWxkZXIKIHsKQEAgLTM2LDYgKzM4LDcgQEAKICAgICBwcml2YXRlIGJvb2wgX3ZlcmlmeUNlcnRpZmljYXRlQXV0aG9yaXR5OwogICAgIHByaXZhdGUgYm9vbCBfdmVyaWZ5Q2VydGlmaWNhdGVOYW1lOwogICAgIHByaXZhdGUgVGltZVNwYW4gX2Nsb3NlSW5hY3RpdmVDb25uZWN0aW9uc0ludGVydmFsOworICAgIHByaXZhdGUgRnVuYzxUYXNrPHN0cmluZz4+PyBfdG9rZW5GYWN0b3J5OwogCiAgICAgcHVibGljIFB1bHNhckNsaWVudEJ1aWxkZXIoKQogICAgIHsKQEAgLTY5LDYgKzcyLDE1IEBACiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAorICAgIHB1YmxpYyBJUHVsc2FyQ2xpZW50QnVpbGRlciBBdXRoZW50aWNhdGVVc2luZ1Rva2VuKEZ1bmM8VGFzazxzdHJpbmc+PiB0b2tlbkZhY3RvcnkpCisgICAgeworICAgICAgICBfdG9rZW5GYWN0b3J5ID0gdG9rZW5GYWN0b3J5OworICAgICAgICB2YXIgZmVhdHVyZUZsYWdzID0gX2NvbW1hbmRDb25uZWN0LkZlYXR1cmVGbGFncyA/PyBuZXcgRmVhdHVyZUZsYWdzKCk7CisgICAgICAgIGZlYXR1cmVGbGFncy5TdXBwb3J0c0F1dGhSZWZyZXNoID0gdHJ1ZTsKKyAgICAgICAgX2NvbW1hbmRDb25uZWN0LkZlYXR1cmVGbGFncyA9IGZlYXR1cmVGbGFnczsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCiAgICAgcHVibGljIElQdWxzYXJDbGllbnRCdWlsZGVyIENvbm5lY3Rpb25TZWN1cml0eShFbmNyeXB0aW9uUG9saWN5IGVuY3J5cHRpb25Qb2xpY3kpCiAgICAgewogICAgICAgICBfZW5jcnlwdGlvblBvbGljeSA9IGVuY3J5cHRpb25Qb2xpY3k7CkBAIC0xNTIsMTMgKzE2NCwyMSBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFNjaGVtZUV4Y2VwdGlvbigkIkludmFsaWQgc2NoZW1lICd7c2NoZW1lfScuIEV4cGVjdGVkICd7Q29uc3RhbnRzLlB1bHNhclNjaGVtZX0nIG9yICd7Q29uc3RhbnRzLlB1bHNhclNzbFNjaGVtZX0nIik7CiAKLQogICAgICAgICB2YXIgY29ubmVjdG9yID0gbmV3IENvbm5lY3RvcihfY2xpZW50Q2VydGlmaWNhdGVzLCBfdHJ1c3RlZENlcnRpZmljYXRlQXV0aG9yaXR5LCBfdmVyaWZ5Q2VydGlmaWNhdGVBdXRob3JpdHksIF92ZXJpZnlDZXJ0aWZpY2F0ZU5hbWUpOwotICAgICAgICB2YXIgY29ubmVjdGlvblBvb2wgPSBuZXcgQ29ubmVjdGlvblBvb2woX2NvbW1hbmRDb25uZWN0LCBfc2VydmljZVVybCwgY29ubmVjdG9yLCBfZW5jcnlwdGlvblBvbGljeS5WYWx1ZSwgX2Nsb3NlSW5hY3RpdmVDb25uZWN0aW9uc0ludGVydmFsLCBfbGlzdGVuZXJOYW1lLCBfa2VlcEFsaXZlSW50ZXJ2YWwpOwotICAgICAgICB2YXIgcHJvY2Vzc01hbmFnZXIgPSBuZXcgUHJvY2Vzc01hbmFnZXIoY29ubmVjdGlvblBvb2wpOworCiAgICAgICAgIHZhciBleGNlcHRpb25IYW5kbGVycyA9IG5ldyBMaXN0PElIYW5kbGVFeGNlcHRpb24+KF9leGNlcHRpb25IYW5kbGVycykgeyBuZXcgRGVmYXVsdEV4Y2VwdGlvbkhhbmRsZXIoX3JldHJ5SW50ZXJ2YWwpIH07CiAgICAgICAgIHZhciBleGNlcHRpb25IYW5kbGVyUGlwZWxpbmUgPSBuZXcgRXhjZXB0aW9uSGFuZGxlclBpcGVsaW5lKGV4Y2VwdGlvbkhhbmRsZXJzKTsKKyAgICAgICAgdmFyIGNvbm5lY3Rpb25Qb29sID0gbmV3IENvbm5lY3Rpb25Qb29sKF9jb21tYW5kQ29ubmVjdCwgX3NlcnZpY2VVcmwsIGNvbm5lY3RvciwgX2VuY3J5cHRpb25Qb2xpY3kuVmFsdWUsIF9jbG9zZUluYWN0aXZlQ29ubmVjdGlvbnNJbnRlcnZhbCwgX2xpc3RlbmVyTmFtZSwKKyAgICAgICAgICAgIF9rZWVwQWxpdmVJbnRlcnZhbCwKKyAgICAgICAgICAgIG5ldyBFeGVjdXRvcihHdWlkLkVtcHR5LCBuZXcgRW1wdHlSZWdpc3RlckV2ZW50KCksIGV4Y2VwdGlvbkhhbmRsZXJQaXBlbGluZSksCisgICAgICAgICAgICBfdG9rZW5GYWN0b3J5KTsKKyAgICAgICAgdmFyIHByb2Nlc3NNYW5hZ2VyID0gbmV3IFByb2Nlc3NNYW5hZ2VyKGNvbm5lY3Rpb25Qb29sKTsKIAogICAgICAgICByZXR1cm4gbmV3IFB1bHNhckNsaWVudChjb25uZWN0aW9uUG9vbCwgcHJvY2Vzc01hbmFnZXIsIGV4Y2VwdGlvbkhhbmRsZXJQaXBlbGluZSwgX3NlcnZpY2VVcmwpOwogICAgIH0KIH0KKworaW50ZXJuYWwgY2xhc3MgRW1wdHlSZWdpc3RlckV2ZW50IDogSVJlZ2lzdGVyRXZlbnQKK3sKKyAgICBwdWJsaWMgdm9pZCBSZWdpc3RlcihJRXZlbnQgQGV2ZW50KSB7IH0KK30KZGlmZiAtLWdpdCBhL3NyYy9Eb3RQdWxzYXIvSW50ZXJuYWwvVG9rZW5GYWN0b3J5RXh0ZW5zaW9ucy5jcyBiL3NyYy9Eb3RQdWxzYXIvSW50ZXJuYWwvVG9rZW5GYWN0b3J5RXh0ZW5zaW9ucy5jcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWEyNmJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0RvdFB1bHNhci9JbnRlcm5hbC9Ub2tlbkZhY3RvcnlFeHRlbnNpb25zLmNzCkBAIC0wLDAgKzEsMjYgQEAKK25hbWVzcGFjZSBEb3RQdWxzYXIuSW50ZXJuYWw7CisKK3VzaW5nIEFic3RyYWN0aW9uczsKK3VzaW5nIEV4Y2VwdGlvbnM7Cit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCitpbnRlcm5hbCBzdGF0aWMgY2xhc3MgVG9rZW5GYWN0b3J5RXh0ZW5zaW9ucworeworICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgVGFzazxzdHJpbmc+IEdldFRva2VuKHRoaXMgRnVuYzxUYXNrPHN0cmluZz4+IHRva2VuRmFjdG9yeSwgSUV4ZWN1dGUgZXhlY3V0b3IpCisgICAgeworICAgICAgICByZXR1cm4gYXdhaXQgZXhlY3V0b3IuRXhlY3V0ZSh0b2tlbkZhY3RvcnkuR2V0VG9rZW4pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgVGFzazxzdHJpbmc+IEdldFRva2VuKHRoaXMgRnVuYzxUYXNrPHN0cmluZz4+IHRva2VuRmFjdG9yeSkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXdhaXQgdG9rZW5GYWN0b3J5KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVG9rZW5GYWN0b3J5RmFpbGVkRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMvRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMuY3Nwcm9qIGIvdGVzdHMvRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMvRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMuY3Nwcm9qCmluZGV4IGM2NWZiNTMuLmMxOTk3YjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzLmNzcHJvagorKysgYi90ZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy5jc3Byb2oKQEAgLTI4LDYgKzI4LDEyIEBACiAgICAgICA8Tm9uZSBVcGRhdGU9ImRvY2tlci1jb21wb3NlLXN0YW5kYWxvbmUtdGVzdHMueW1sIj4KICAgICAgICAgPENvcHlUb091dHB1dERpcmVjdG9yeT5BbHdheXM8L0NvcHlUb091dHB1dERpcmVjdG9yeT4KICAgICAgIDwvTm9uZT4KKyAgICAgIDxOb25lIFVwZGF0ZT0iZG9ja2VyLWNvbXBvc2Utc3RhbmRhbG9uZS10b2tlbi10ZXN0cy55bWwiPgorICAgICAgICA8Q29weVRvT3V0cHV0RGlyZWN0b3J5PkFsd2F5czwvQ29weVRvT3V0cHV0RGlyZWN0b3J5PgorICAgICAgPC9Ob25lPgorICAgICAgPE5vbmUgVXBkYXRlPSJhcHBkYXRhXG15LXNlY3JldC5rZXkiPgorICAgICAgICA8Q29weVRvT3V0cHV0RGlyZWN0b3J5PkFsd2F5czwvQ29weVRvT3V0cHV0RGlyZWN0b3J5PgorICAgICAgPC9Ob25lPgogICAgIDwvSXRlbUdyb3VwPgogCiA8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy9GaXh0dXJlcy9TdGFuZGFsb25lQ2x1c3RlckZpeHR1cmUuY3MgYi90ZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy9GaXh0dXJlcy9TdGFuZGFsb25lQ2x1c3RlckZpeHR1cmUuY3MKaW5kZXggYzNlOGQ5ZC4uZWViMzA5MCAxMDA2NDQKLS0tIGEvdGVzdHMvRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMvRml4dHVyZXMvU3RhbmRhbG9uZUNsdXN0ZXJGaXh0dXJlLmNzCisrKyBiL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL0ZpeHR1cmVzL1N0YW5kYWxvbmVDbHVzdGVyRml4dHVyZS5jcwpAQCAtMTgsMTQgKzE4LDIyIEBACiB1c2luZyBTZXJ2aWNlczsKIHVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CiB1c2luZyBYdW5pdDsKK3VzaW5nIFh1bml0LkFic3RyYWN0aW9uczsKIAogcHVibGljIGNsYXNzIFN0YW5kYWxvbmVDbHVzdGVyRml4dHVyZSA6IElBc3luY0xpZmV0aW1lCiB7CisgICAgcHJpdmF0ZSByZWFkb25seSBJTWVzc2FnZVNpbmsgX21lc3NhZ2VTaW5rOworCisgICAgcHVibGljIFN0YW5kYWxvbmVDbHVzdGVyRml4dHVyZShJTWVzc2FnZVNpbmsgbWVzc2FnZVNpbmspCisgICAgeworICAgICAgICBfbWVzc2FnZVNpbmsgPSBtZXNzYWdlU2luazsKKyAgICB9CisKICAgICBwdWJsaWMgSVB1bHNhclNlcnZpY2U/IFB1bHNhclNlcnZpY2UgeyBwcml2YXRlIHNldDsgZ2V0OyB9CiAKICAgICBwdWJsaWMgYXN5bmMgVGFzayBJbml0aWFsaXplQXN5bmMoKQogICAgIHsKLSAgICAgICAgUHVsc2FyU2VydmljZSA9IFNlcnZpY2VGYWN0b3J5LkNyZWF0ZVB1bHNhclNlcnZpY2UoKTsKKyAgICAgICAgUHVsc2FyU2VydmljZSA9IFNlcnZpY2VGYWN0b3J5LkNyZWF0ZVB1bHNhclNlcnZpY2UoX21lc3NhZ2VTaW5rKTsKICAgICAgICAgYXdhaXQgUHVsc2FyU2VydmljZS5Jbml0aWFsaXplQXN5bmMoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL0ZpeHR1cmVzL1N0YW5kYWxvbmVUb2tlbkNsdXN0ZXJUZXN0LmNzIGIvdGVzdHMvRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMvRml4dHVyZXMvU3RhbmRhbG9uZVRva2VuQ2x1c3RlclRlc3QuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyN2I5MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL0ZpeHR1cmVzL1N0YW5kYWxvbmVUb2tlbkNsdXN0ZXJUZXN0LmNzCkBAIC0wLDAgKzEsNiBAQAorbmFtZXNwYWNlIERvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzLkZpeHR1cmVzOworCit1c2luZyBYdW5pdDsKKworW0NvbGxlY3Rpb25EZWZpbml0aW9uKG5hbWVvZihTdGFuZGFsb25lVG9rZW5DbHVzdGVyVGVzdCkpXQorcHVibGljIGNsYXNzIFN0YW5kYWxvbmVUb2tlbkNsdXN0ZXJUZXN0IDogSUNvbGxlY3Rpb25GaXh0dXJlPFRva2VuQ2x1c3RlckZpeHR1cmU+IHsgfQpkaWZmIC0tZ2l0IGEvdGVzdHMvRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMvRml4dHVyZXMvVG9rZW5DbHVzdGVyRml4dHVyZS5jcyBiL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL0ZpeHR1cmVzL1Rva2VuQ2x1c3RlckZpeHR1cmUuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1NzkxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL0ZpeHR1cmVzL1Rva2VuQ2x1c3RlckZpeHR1cmUuY3MKQEAgLTAsMCArMSw4OCBAQAorbmFtZXNwYWNlIERvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzLkZpeHR1cmVzOworCit1c2luZyBBYnN0cmFjdGlvbjsKK3VzaW5nIFNlcnZpY2VzOwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLk5ldC5IdHRwOwordXNpbmcgU3lzdGVtLk5ldC5IdHRwLkhlYWRlcnM7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgWHVuaXQuQWJzdHJhY3Rpb25zOwordXNpbmcgWHVuaXQuU2RrOworCitwdWJsaWMgY2xhc3MgVG9rZW5DbHVzdGVyRml4dHVyZSA6IFB1bHNhclNlcnZpY2VCYXNlCit7CisgICAgcHJpdmF0ZSByZWFkb25seSBJTWVzc2FnZVNpbmsgX21lc3NhZ2VTaW5rOworCisgICAgcHVibGljIFRva2VuQ2x1c3RlckZpeHR1cmUoSU1lc3NhZ2VTaW5rIG1lc3NhZ2VTaW5rKSA6IGJhc2UobWVzc2FnZVNpbmspCisgICAgeworICAgICAgICBfbWVzc2FnZVNpbmsgPSBtZXNzYWdlU2luazsKKyAgICB9CisKKyAgICBwdWJsaWMgSVB1bHNhclNlcnZpY2UgUHVsc2FyU2VydmljZSA9PiB0aGlzOworCisgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgSW5pdGlhbGl6ZUFzeW5jKCkKKyAgICB7CisgICAgICAgIGF3YWl0IFRha2VEb3duUHVsc2FyKCk7IC8vIGNsZWFuLXVwIGlmIGFueXRoaW5nIHdhcyBsZWZ0IHJ1bm5pbmcgZnJvbSBwcmV2aW91cyBydW4KKworICAgICAgICBhd2FpdCBQcm9jZXNzQXN5bmNIZWxwZXIuRXhlY3V0ZVNoZWxsQ29tbWFuZCgiZG9ja2VyLWNvbXBvc2UiLCAiLWYgZG9ja2VyLWNvbXBvc2Utc3RhbmRhbG9uZS10b2tlbi10ZXN0cy55bWwgdXAgLWQiKQorICAgICAgICAgICAgLlRocm93T25GYWlsdXJlKCk7CisKKyAgICAgICAgdmFyIHdhaXRUcmllcyA9IDEwOworCisgICAgICAgIHVzaW5nIHZhciBoYW5kbGVyID0gbmV3IEh0dHBDbGllbnRIYW5kbGVyIHsgQWxsb3dBdXRvUmVkaXJlY3QgPSB0cnVlIH07CisKKyAgICAgICAgdXNpbmcgdmFyIGNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KGhhbmRsZXIpOworCisgICAgICAgIHZhciB0b2tlbiA9IGF3YWl0IEdldEF1dGhUb2tlbihmYWxzZSk7CisKKyAgICAgICAgY2xpZW50LkRlZmF1bHRSZXF1ZXN0SGVhZGVycy5BdXRob3JpemF0aW9uID0gbmV3IEF1dGhlbnRpY2F0aW9uSGVhZGVyVmFsdWUoIkJlYXJlciIsIHRva2VuKTsKKworICAgICAgICB3aGlsZSAod2FpdFRyaWVzID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXdhaXQgY2xpZW50LkdldEFzeW5jKCQie1B1bHNhclNlcnZpY2UuR2V0V2ViU2VydmljZVVyaSgpfS9tZXRyaWNzLyIpLkNvbmZpZ3VyZUF3YWl0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfbWVzc2FnZVNpbmsuT25NZXNzYWdlKG5ldyBEaWFnbm9zdGljTWVzc2FnZSgiRXJyb3IgdHJ5aW5nIHRvIGZldGNoIG1ldHJpY3M6IHswfSIsIGUpKTsKKyAgICAgICAgICAgICAgICB3YWl0VHJpZXMtLTsKKyAgICAgICAgICAgICAgICBhd2FpdCBUYXNrLkRlbGF5KDUwMDApLkNvbmZpZ3VyZUF3YWl0KGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVuYWJsZSB0byBjb25maXJtIFB1bHNhciBoYXMgaW5pdGlhbGl6ZWQiKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgVGFzayBPbkRpc3Bvc2UoKQorICAgICAgICA9PiBhd2FpdCBUYWtlRG93blB1bHNhcigpOworCisgICAgcHVibGljIG92ZXJyaWRlIFVyaSBHZXRCcm9rZXJVcmkoKSA9PiBuZXcoInB1bHNhcjovL2xvY2FsaG9zdDo1NDU0NyIpOworCisgICAgcHVibGljIG92ZXJyaWRlIFVyaSBHZXRXZWJTZXJ2aWNlVXJpKCkgPT4gbmV3KCJodHRwOi8vbG9jYWxob3N0OjU0NTQ4Iik7CisKKyAgICBwcml2YXRlIFRhc2sgVGFrZURvd25QdWxzYXIoKQorICAgICAgICA9PiBQcm9jZXNzQXN5bmNIZWxwZXIuRXhlY3V0ZVNoZWxsQ29tbWFuZCgiZG9ja2VyLWNvbXBvc2UiLCAiLWYgZG9ja2VyLWNvbXBvc2Utc3RhbmRhbG9uZS10b2tlbi10ZXN0cy55bWwgZG93biIpCisgICAgICAgICAgICAuTG9nRmFpbHVyZShzID0+IE1lc3NhZ2VTaW5rLk9uTWVzc2FnZShuZXcgRGlhZ25vc3RpY01lc3NhZ2UoIkVycm9yIGJyaW5naW5nIGRvd24gY29udGFpbmVyOiB7MH0iLCBzKSkpOworCisgICAgcHVibGljIHN0YXRpYyBhc3luYyBUYXNrPHN0cmluZz4gR2V0QXV0aFRva2VuKGJvb2wgaW5jbHVkZUV4cGlyeSkKKyAgICB7CisgICAgICAgIHZhciBhcmd1bWVudHMgPSAiZXhlYyBwdWxzYXItdG9rZW5zIGJpbi9wdWxzYXIgdG9rZW5zIGNyZWF0ZSAtLXNlY3JldC1rZXkgZmlsZTovLy9hcHBkYXRhL215LXNlY3JldC5rZXkgLS1zdWJqZWN0IHRlc3QtdXNlciI7CisKKyAgICAgICAgaWYgKGluY2x1ZGVFeHBpcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFyZ3VtZW50cyArPSAiIC0tZXhwaXJ5LXRpbWUgMTBzIjsKKyAgICAgICAgfQorCisgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCBQcm9jZXNzQXN5bmNIZWxwZXIuRXhlY3V0ZVNoZWxsQ29tbWFuZCgiZG9ja2VyIiwKKyAgICAgICAgICAgIGFyZ3VtZW50cyk7CisKKyAgICAgICAgaWYgKCFyZXN1bHQuQ29tcGxldGVkKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigkIkdldHRpbmcgdG9rZW4gZnJvbSBjb250YWluZXIgZmFpbGVke0Vudmlyb25tZW50Lk5ld0xpbmV9e3Jlc3VsdC5PdXRwdXR9Iik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0Lk91dHB1dDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy9Qcm9jZXNzQXN5bmNIZWxwZXIuY3MgYi90ZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy9Qcm9jZXNzQXN5bmNIZWxwZXIuY3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjMDBiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL1Byb2Nlc3NBc3luY0hlbHBlci5jcwpAQCAtMCwwICsxLDEyNyBAQAordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkRpYWdub3N0aWNzOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOworCituYW1lc3BhY2UgRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHM7CisKK3B1YmxpYyBzdGF0aWMgY2xhc3MgUHJvY2Vzc0FzeW5jSGVscGVyCit7CisgICAgcHVibGljIHN0YXRpYyBhc3luYyBUYXNrIFRocm93T25GYWlsdXJlKHRoaXMgVGFzazxQcm9jZXNzUmVzdWx0PiByZXN1bHRUYXNrKQorICAgIHsKKyAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IHJlc3VsdFRhc2s7CisKKyAgICAgICAgaWYgKCFyZXN1bHQuQ29tcGxldGVkKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigkIlByb2Nlc3MgZGlkIG5vdCBjb21wbGV0ZSBjb3JyZWN0bHksIHtFbnZpcm9ubWVudC5OZXdMaW5lfXtyZXN1bHQuT3V0cHV0fSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBhc3luYyBUYXNrIExvZ0ZhaWx1cmUodGhpcyBUYXNrPFByb2Nlc3NSZXN1bHQ+IHJlc3VsdFRhc2ssIEFjdGlvbjxzdHJpbmc+IGxvZ0FjdGlvbikKKyAgICB7CisgICAgICAgIHZhciByZXN1bHQgPSBhd2FpdCByZXN1bHRUYXNrOworCisgICAgICAgIGlmICghcmVzdWx0LkNvbXBsZXRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nQWN0aW9uKHJlc3VsdC5PdXRwdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBhc3luYyBUYXNrPFByb2Nlc3NSZXN1bHQ+IEV4ZWN1dGVTaGVsbENvbW1hbmQoc3RyaW5nIGNvbW1hbmQsIHN0cmluZyBhcmd1bWVudHMpCisgICAgeworICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IFByb2Nlc3NSZXN1bHQoKTsKKworICAgICAgICB1c2luZyB2YXIgcHJvY2VzcyA9IG5ldyBQcm9jZXNzKCk7CisKKyAgICAgICAgcHJvY2Vzcy5TdGFydEluZm8uRmlsZU5hbWUgPSBjb21tYW5kOworICAgICAgICBwcm9jZXNzLlN0YXJ0SW5mby5Bcmd1bWVudHMgPSBhcmd1bWVudHM7CisgICAgICAgIHByb2Nlc3MuU3RhcnRJbmZvLlVzZVNoZWxsRXhlY3V0ZSA9IGZhbHNlOworICAgICAgICBwcm9jZXNzLlN0YXJ0SW5mby5SZWRpcmVjdFN0YW5kYXJkT3V0cHV0ID0gdHJ1ZTsKKyAgICAgICAgcHJvY2Vzcy5TdGFydEluZm8uUmVkaXJlY3RTdGFuZGFyZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcHJvY2Vzcy5TdGFydEluZm8uQ3JlYXRlTm9XaW5kb3cgPSB0cnVlOworCisgICAgICAgIHZhciBvdXRwdXRCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgdmFyIG91dHB1dENsb3NlRXZlbnQgPSBuZXcgVGFza0NvbXBsZXRpb25Tb3VyY2U8Ym9vbD4oKTsKKworICAgICAgICBwcm9jZXNzLk91dHB1dERhdGFSZWNlaXZlZCArPSAocywgZSkgPT4KKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlIG91dHB1dCBzdHJlYW0gaGFzIGJlZW4gY2xvc2VkIGkuZS4gdGhlIHByb2Nlc3MgaGFzIHRlcm1pbmF0ZWQKKyAgICAgICAgICAgIGlmIChlLkRhdGEgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRDbG9zZUV2ZW50LlNldFJlc3VsdCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWlsZGVyLkFwcGVuZChlLkRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHZhciBlcnJvckJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICB2YXIgZXJyb3JDbG9zZUV2ZW50ID0gbmV3IFRhc2tDb21wbGV0aW9uU291cmNlPGJvb2w+KCk7CisKKyAgICAgICAgcHJvY2Vzcy5FcnJvckRhdGFSZWNlaXZlZCArPSAocywgZSkgPT4KKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlIGVycm9yIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQgaS5lLiB0aGUgcHJvY2VzcyBoYXMgdGVybWluYXRlZAorICAgICAgICAgICAgaWYgKGUuRGF0YSA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycm9yQ2xvc2VFdmVudC5TZXRSZXN1bHQodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXJyb3JCdWlsZGVyLkFwcGVuZChlLkRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGJvb2wgaXNTdGFydGVkOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpc1N0YXJ0ZWQgPSBwcm9jZXNzLlN0YXJ0KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlcnJvcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVXN1YWxseSBpdCBvY2N1cnMgd2hlbiBhbiBleGVjdXRhYmxlIGZpbGUgaXMgbm90IGZvdW5kIG9yIGlzIG5vdCBleGVjdXRhYmxlCisKKyAgICAgICAgICAgIHJlc3VsdC5Db21wbGV0ZWQgPSB0cnVlOworICAgICAgICAgICAgcmVzdWx0LkV4aXRDb2RlID0gLTE7CisgICAgICAgICAgICByZXN1bHQuT3V0cHV0ID0gZXJyb3IuTWVzc2FnZTsKKworICAgICAgICAgICAgaXNTdGFydGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNTdGFydGVkKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBSZWFkcyB0aGUgb3V0cHV0IHN0cmVhbSBmaXJzdCBhbmQgdGhlbiB3YWl0cyBiZWNhdXNlIGRlYWRsb2NrcyBhcmUgcG9zc2libGUKKyAgICAgICAgICAgIHByb2Nlc3MuQmVnaW5PdXRwdXRSZWFkTGluZSgpOworICAgICAgICAgICAgcHJvY2Vzcy5CZWdpbkVycm9yUmVhZExpbmUoKTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlcyB0YXNrIHRvIHdhaXQgZm9yIHByb2Nlc3MgZXhpdCB1c2luZyB0aW1lb3V0CisgICAgICAgICAgICB2YXIgd2FpdEZvckV4aXQgPSBXYWl0Rm9yRXhpdEFzeW5jKHByb2Nlc3MpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgdGFzayB0byB3YWl0IGZvciBwcm9jZXNzIGV4aXQgYW5kIGNsb3NpbmcgYWxsIG91dHB1dCBzdHJlYW1zCisgICAgICAgICAgICBhd2FpdCBUYXNrLldoZW5BbGwod2FpdEZvckV4aXQsIG91dHB1dENsb3NlRXZlbnQuVGFzaywgZXJyb3JDbG9zZUV2ZW50LlRhc2spOworCisgICAgICAgICAgICByZXN1bHQuQ29tcGxldGVkID0gd2FpdEZvckV4aXQuUmVzdWx0OworICAgICAgICAgICAgcmVzdWx0LkV4aXRDb2RlID0gcHJvY2Vzcy5FeGl0Q29kZTsKKyAgICAgICAgICAgIC8vIEFkZHMgcHJvY2VzcyBvdXRwdXQgaWYgaXQgd2FzIGNvbXBsZXRlZCB3aXRoIGVycm9yCisgICAgICAgICAgICByZXN1bHQuT3V0cHV0ID0gcHJvY2Vzcy5FeGl0Q29kZSAhPSAwID8gJCJ7b3V0cHV0QnVpbGRlcn17ZXJyb3JCdWlsZGVyfSIgOiBvdXRwdXRCdWlsZGVyLlRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgVGFzazxib29sPiBXYWl0Rm9yRXhpdEFzeW5jKFByb2Nlc3MgcHJvY2VzcykKKyAgICB7CisgICAgICAgIGF3YWl0IHByb2Nlc3MuV2FpdEZvckV4aXRBc3luYygpOworICAgICAgICByZXR1cm4gcHJvY2Vzcy5FeGl0Q29kZSA9PSAwOworICAgIH0KKworCisgICAgcHVibGljIHN0cnVjdCBQcm9jZXNzUmVzdWx0CisgICAgeworICAgICAgICBwdWJsaWMgYm9vbCBDb21wbGV0ZWQ7CisgICAgICAgIHB1YmxpYyBpbnQ/IEV4aXRDb2RlOworICAgICAgICBwdWJsaWMgc3RyaW5nIE91dHB1dDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy9TZXJ2aWNlcy9QdWxzYXJTZXJ2aWNlQmFzZS5jcyBiL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL1NlcnZpY2VzL1B1bHNhclNlcnZpY2VCYXNlLmNzCmluZGV4IDdmNjQyZDguLmM2MTRhODQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL1NlcnZpY2VzL1B1bHNhclNlcnZpY2VCYXNlLmNzCisrKyBiL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL1NlcnZpY2VzL1B1bHNhclNlcnZpY2VCYXNlLmNzCkBAIC0yMCwzMyArMjAsNDUgQEAKIHVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLlRocmVhZGluZzsKIHVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBYdW5pdC5BYnN0cmFjdGlvbnM7Cit1c2luZyBYdW5pdC5TZGs7CiAKLXB1YmxpYyBjbGFzcyBQdWxzYXJTZXJ2aWNlQmFzZSA6IElQdWxzYXJTZXJ2aWNlCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHVsc2FyU2VydmljZUJhc2UgOiBJUHVsc2FyU2VydmljZQogeworICAgIHByb3RlY3RlZCByZWFkb25seSBJTWVzc2FnZVNpbmsgTWVzc2FnZVNpbms7CiAgICAgcHJpdmF0ZSByZWFkb25seSBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSBfY3RzOwogICAgIHByaXZhdGUgcmVhZG9ubHkgSHR0cENsaWVudCBfYWRtaW5DbGllbnQ7CiAKLSAgICBwcm90ZWN0ZWQgUHVsc2FyU2VydmljZUJhc2UoKQorICAgIHByb3RlY3RlZCBQdWxzYXJTZXJ2aWNlQmFzZShJTWVzc2FnZVNpbmsgbWVzc2FnZVNpbmspCiAgICAgeworICAgICAgICBNZXNzYWdlU2luayA9IG1lc3NhZ2VTaW5rOwogICAgICAgICBfY3RzID0gbmV3IENhbmNlbGxhdGlvblRva2VuU291cmNlKCk7CiAgICAgICAgIF9hZG1pbkNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7CiAgICAgfQogCi0gICAgcHVibGljIHZpcnR1YWwgVGFzayBJbml0aWFsaXplQXN5bmMoKQotICAgICAgICA9PiBUYXNrLkNvbXBsZXRlZFRhc2s7CisgICAgcHVibGljIGFic3RyYWN0IFRhc2sgSW5pdGlhbGl6ZUFzeW5jKCk7CiAKLSAgICBwdWJsaWMgdmlydHVhbCBUYXNrIERpc3Bvc2VBc3luYygpCisgICAgcHVibGljIGFzeW5jIFRhc2sgRGlzcG9zZUFzeW5jKCkKICAgICB7CiAgICAgICAgIF9hZG1pbkNsaWVudC5EaXNwb3NlKCk7CiAgICAgICAgIF9jdHMuRGlzcG9zZSgpOwotICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBPbkRpc3Bvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1lc3NhZ2VTaW5rLk9uTWVzc2FnZShuZXcgRGlhZ25vc3RpY01lc3NhZ2UoIkVycm9yIGRpc3Bvc2luZzogezB9IiwgZSkpOworICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZpcnR1YWwgVXJpIEdldEJyb2tlclVyaSgpCi0gICAgICAgID0+IHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOworICAgIHByb3RlY3RlZCB2aXJ0dWFsIFRhc2sgT25EaXNwb3NlKCkKKyAgICAgICAgPT4gVGFzay5Db21wbGV0ZWRUYXNrOwogCi0gICAgcHVibGljIHZpcnR1YWwgVXJpIEdldFdlYlNlcnZpY2VVcmkoKQotICAgICAgICA9PiB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKKyAgICBwdWJsaWMgYWJzdHJhY3QgVXJpIEdldEJyb2tlclVyaSgpOworCisgICAgcHVibGljIGFic3RyYWN0IFVyaSBHZXRXZWJTZXJ2aWNlVXJpKCk7CiAKICAgICBwdWJsaWMgYXN5bmMgVGFzazxIdHRwUmVzcG9uc2VNZXNzYWdlPz4gQ3JlYXRlUGFydGl0aW9uZWRUb3BpYyhzdHJpbmcgcmVzdFRvcGljLCBpbnQgbnVtUGFydGl0aW9ucykKICAgICB7CmRpZmYgLS1naXQgYS90ZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy9TZXJ2aWNlcy9TZXJ2aWNlRmFjdG9yeS5jcyBiL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL1NlcnZpY2VzL1NlcnZpY2VGYWN0b3J5LmNzCmluZGV4IDNiOWUwYTEuLjkwZTEwZWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL1NlcnZpY2VzL1NlcnZpY2VGYWN0b3J5LmNzCisrKyBiL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL1NlcnZpY2VzL1NlcnZpY2VGYWN0b3J5LmNzCkBAIC0xNSwyMSArMTUsMjIgQEAKIG5hbWVzcGFjZSBEb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy5TZXJ2aWNlczsKIAogdXNpbmcgQWJzdHJhY3Rpb247Cit1c2luZyBYdW5pdC5BYnN0cmFjdGlvbnM7CiAKIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VydmljZUZhY3RvcnkKIHsKICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfcHVsc2FyRGVwbG95bWVudFR5cGUgPSAiUFVMU0FSX0RFUExPWU1FTlRfVFlQRSI7CiAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2NvbnRhaW5lckRlcGxveW1lbnQgPSAiY29udGFpbmVyIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgSVB1bHNhclNlcnZpY2UgQ3JlYXRlUHVsc2FyU2VydmljZSgpCisgICAgcHVibGljIHN0YXRpYyBJUHVsc2FyU2VydmljZSBDcmVhdGVQdWxzYXJTZXJ2aWNlKElNZXNzYWdlU2luayBtZXNzYWdlU2luaykKICAgICB7CiAgICAgICAgIHZhciBkZXBsb3ltZW50VHlwZSA9IFN5c3RlbS5FbnZpcm9ubWVudC5HZXRFbnZpcm9ubWVudFZhcmlhYmxlKF9wdWxzYXJEZXBsb3ltZW50VHlwZSk7CiAKICAgICAgICAgaWYgKGRlcGxveW1lbnRUeXBlID09IF9jb250YWluZXJEZXBsb3ltZW50KQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YW5kYWxvbmVDb250YWluZXJTZXJ2aWNlKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0YW5kYWxvbmVDb250YWluZXJTZXJ2aWNlKG1lc3NhZ2VTaW5rKTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBuZXcgU3RhbmRhbG9uZUV4dGVybmFsU2VydmljZSgpOworICAgICAgICByZXR1cm4gbmV3IFN0YW5kYWxvbmVFeHRlcm5hbFNlcnZpY2UobWVzc2FnZVNpbmspOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL1NlcnZpY2VzL1N0YW5kYWxvbmVDb250YWluZXJTZXJ2aWNlLmNzIGIvdGVzdHMvRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMvU2VydmljZXMvU3RhbmRhbG9uZUNvbnRhaW5lclNlcnZpY2UuY3MKaW5kZXggZTU0YjBmYi4uNGQ3ZDQyZSAxMDA2NDQKLS0tIGEvdGVzdHMvRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMvU2VydmljZXMvU3RhbmRhbG9uZUNvbnRhaW5lclNlcnZpY2UuY3MKKysrIGIvdGVzdHMvRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMvU2VydmljZXMvU3RhbmRhbG9uZUNvbnRhaW5lclNlcnZpY2UuY3MKQEAgLTE1LDE4ICsxNSwyMSBAQAogbmFtZXNwYWNlIERvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzLlNlcnZpY2VzOwogCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7CiB1c2luZyBTeXN0ZW0uTmV0Lkh0dHA7CiB1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgWHVuaXQuQWJzdHJhY3Rpb25zOwordXNpbmcgWHVuaXQuU2RrOwogCiBwdWJsaWMgc2VhbGVkIGNsYXNzIFN0YW5kYWxvbmVDb250YWluZXJTZXJ2aWNlIDogUHVsc2FyU2VydmljZUJhc2UKIHsKKyAgICBwdWJsaWMgU3RhbmRhbG9uZUNvbnRhaW5lclNlcnZpY2UoSU1lc3NhZ2VTaW5rIG1lc3NhZ2VTaW5rKSA6IGJhc2UobWVzc2FnZVNpbmspIHsgfQorCiAgICAgcHVibGljIG92ZXJyaWRlIGFzeW5jIFRhc2sgSW5pdGlhbGl6ZUFzeW5jKCkKICAgICB7Ci0gICAgICAgIGF3YWl0IGJhc2UuSW5pdGlhbGl6ZUFzeW5jKCkuQ29uZmlndXJlQXdhaXQoZmFsc2UpOwotICAgICAgICBUYWtlRG93blB1bHNhcigpOyAvLyBjbGVhbi11cCBpZiBhbnl0aGluZyB3YXMgbGVmdCBydW5uaW5nIGZyb20gcHJldmlvdXMgcnVuCisgICAgICAgIGF3YWl0IFRha2VEb3duUHVsc2FyKCk7IC8vIGNsZWFuLXVwIGlmIGFueXRoaW5nIHdhcyBsZWZ0IHJ1bm5pbmcgZnJvbSBwcmV2aW91cyBydW4KIAotICAgICAgICBSdW5Qcm9jZXNzKCJkb2NrZXItY29tcG9zZSIsICItZiBkb2NrZXItY29tcG9zZS1zdGFuZGFsb25lLXRlc3RzLnltbCB1cCAtZCIpOworICAgICAgICBhd2FpdCBQcm9jZXNzQXN5bmNIZWxwZXIuRXhlY3V0ZVNoZWxsQ29tbWFuZCgiZG9ja2VyLWNvbXBvc2UiLCAiLWYgZG9ja2VyLWNvbXBvc2Utc3RhbmRhbG9uZS10ZXN0cy55bWwgdXAgLWQiKQorICAgICAgICAgICAgLlRocm93T25GYWlsdXJlKCk7CiAKICAgICAgICAgdmFyIHdhaXRUcmllcyA9IDEwOwogCkBAIC01MSwzMyArNTQsMTEgQEAKICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5hYmxlIHRvIGNvbmZpcm0gUHVsc2FyIGhhcyBpbml0aWFsaXplZCIpOwogICAgIH0KIAotICAgIHB1YmxpYyBvdmVycmlkZSBhc3luYyBUYXNrIERpc3Bvc2VBc3luYygpCi0gICAgewotICAgICAgICBhd2FpdCBiYXNlLkRpc3Bvc2VBc3luYygpLkNvbmZpZ3VyZUF3YWl0KGZhbHNlKTsKLSAgICAgICAgVGFrZURvd25QdWxzYXIoKTsKLSAgICB9CisgICAgcHJvdGVjdGVkIG92ZXJyaWRlIFRhc2sgT25EaXNwb3NlKCkgPT4gVGFrZURvd25QdWxzYXIoKTsKIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVGFrZURvd25QdWxzYXIoKQotICAgICAgICA9PiBSdW5Qcm9jZXNzKCJkb2NrZXItY29tcG9zZSIsICItZiBkb2NrZXItY29tcG9zZS1zdGFuZGFsb25lLXRlc3RzLnltbCBkb3duIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFJ1blByb2Nlc3Moc3RyaW5nIG5hbWUsIHN0cmluZyBhcmd1bWVudHMpCi0gICAgewotICAgICAgICB2YXIgcHJvY2Vzc1N0YXJ0SW5mbyA9IG5ldyBQcm9jZXNzU3RhcnRJbmZvIHsgRmlsZU5hbWUgPSBuYW1lLCBBcmd1bWVudHMgPSBhcmd1bWVudHMgfTsKLQotICAgICAgICBwcm9jZXNzU3RhcnRJbmZvLkVudmlyb25tZW50WyJUQUciXSA9ICJ0ZXN0IjsKLSAgICAgICAgcHJvY2Vzc1N0YXJ0SW5mby5FbnZpcm9ubWVudFsiQ09ORklHVVJBVElPTiJdID0gIkRlYnVnIjsKLSAgICAgICAgcHJvY2Vzc1N0YXJ0SW5mby5FbnZpcm9ubWVudFsiQ09NUFVURVJOQU1FIl0gPSBFbnZpcm9ubWVudC5NYWNoaW5lTmFtZTsKLQotICAgICAgICB2YXIgcHJvY2VzcyA9IFByb2Nlc3MuU3RhcnQocHJvY2Vzc1N0YXJ0SW5mbyk7Ci0KLSAgICAgICAgaWYgKHByb2Nlc3MgaXMgbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlByb2Nlc3MuU3RhcnQgcmV0dXJuZWQgbnVsbCIpOwotCi0gICAgICAgIHByb2Nlc3MuV2FpdEZvckV4aXQoKTsKLQotICAgICAgICBpZiAocHJvY2Vzcy5FeGl0Q29kZSAhPSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigkIkV4aXQgY29kZSB7cHJvY2Vzcy5FeGl0Q29kZX0gd2hlbiBydW5uaW5nIHByb2Nlc3Mge25hbWV9IHdpdGggYXJndW1lbnRzIHthcmd1bWVudHN9Iik7Ci0gICAgfQorICAgIHByaXZhdGUgVGFzayBUYWtlRG93blB1bHNhcigpCisgICAgICAgID0+IFByb2Nlc3NBc3luY0hlbHBlci5FeGVjdXRlU2hlbGxDb21tYW5kKCJkb2NrZXItY29tcG9zZSIsICItZiBkb2NrZXItY29tcG9zZS1zdGFuZGFsb25lLXRlc3RzLnltbCBkb3duIikKKyAgICAgICAgICAgIC5Mb2dGYWlsdXJlKHMgPT4gTWVzc2FnZVNpbmsuT25NZXNzYWdlKG5ldyBEaWFnbm9zdGljTWVzc2FnZSgiRXJyb3IgYnJpbmdpbmcgZG93biBjb250YWluZXI6IHswfSIsIHMpKSk7CiAKICAgICBwdWJsaWMgb3ZlcnJpZGUgVXJpIEdldEJyb2tlclVyaSgpCiAgICAgICAgID0+IG5ldygicHVsc2FyOi8vbG9jYWxob3N0OjU0NTQ1Iik7CmRpZmYgLS1naXQgYS90ZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy9TZXJ2aWNlcy9TdGFuZGFsb25lRXh0ZXJuYWxTZXJ2aWNlLmNzIGIvdGVzdHMvRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMvU2VydmljZXMvU3RhbmRhbG9uZUV4dGVybmFsU2VydmljZS5jcwppbmRleCBlZDcyMjJiLi5jMWNlMmYwIDEwMDY0NAotLS0gYS90ZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy9TZXJ2aWNlcy9TdGFuZGFsb25lRXh0ZXJuYWxTZXJ2aWNlLmNzCisrKyBiL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL1NlcnZpY2VzL1N0YW5kYWxvbmVFeHRlcm5hbFNlcnZpY2UuY3MKQEAgLTE1LDkgKzE1LDE0IEBACiBuYW1lc3BhY2UgRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMuU2VydmljZXM7CiAKIHVzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7Cit1c2luZyBYdW5pdC5BYnN0cmFjdGlvbnM7CiAKIHB1YmxpYyBzZWFsZWQgY2xhc3MgU3RhbmRhbG9uZUV4dGVybmFsU2VydmljZSA6IFB1bHNhclNlcnZpY2VCYXNlCiB7CisgICAgcHVibGljIFN0YW5kYWxvbmVFeHRlcm5hbFNlcnZpY2UoSU1lc3NhZ2VTaW5rIG1lc3NhZ2VTaW5rKSA6IGJhc2UobWVzc2FnZVNpbmspIHsgfQorICAgIHB1YmxpYyBvdmVycmlkZSBUYXNrIEluaXRpYWxpemVBc3luYygpID0+IFRhc2suQ29tcGxldGVkVGFzazsKKwogICAgIHB1YmxpYyBvdmVycmlkZSBVcmkgR2V0QnJva2VyVXJpKCkKICAgICAgICAgPT4gbmV3KCJwdWxzYXI6Ly9sb2NhbGhvc3Q6NjY1MCIpOwogCmRpZmYgLS1naXQgYS90ZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy9Ub2tlblJlZnJlc2hUZXN0cy5jcyBiL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL1Rva2VuUmVmcmVzaFRlc3RzLmNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMDg5MWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy9Ub2tlblJlZnJlc2hUZXN0cy5jcwpAQCAtMCwwICsxLDE1NiBAQAorbmFtZXNwYWNlIERvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzOworCit1c2luZyBBYnN0cmFjdGlvbjsKK3VzaW5nIEFic3RyYWN0aW9uczsKK3VzaW5nIEV4dGVuc2lvbnM7Cit1c2luZyBGaXh0dXJlczsKK3VzaW5nIEludGVybmFsOwordXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkJ1ZmZlcnM7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwordXNpbmcgWHVuaXQ7Cit1c2luZyBYdW5pdC5BYnN0cmFjdGlvbnM7CisKK1tDb2xsZWN0aW9uKG5hbWVvZihTdGFuZGFsb25lVG9rZW5DbHVzdGVyVGVzdCkpXQorcHVibGljIGNsYXNzIFRva2VuUmVmcmVzaFRlc3RzCit7CisgICAgcHVibGljIGVudW0gVG9rZW5UZXN0UmVmcmVzaFR5cGUKKyAgICB7CisgICAgICAgIFN0YW5kYXJkLAorICAgICAgICBGYWlsQXRTdGFydHVwLAorICAgICAgICBGYWlsT25SZWZyZXNoLAorICAgICAgICBUaW1lb3V0T25SZWZyZXNoCisgICAgfQorCisgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgTXlUb3BpYyA9ICJwZXJzaXN0ZW50Oi8vcHVibGljL2RlZmF1bHQvbXl0b3BpYyI7CisgICAgcHJpdmF0ZSByZWFkb25seSBJVGVzdE91dHB1dEhlbHBlciBfdGVzdE91dHB1dEhlbHBlcjsKKyAgICBwcml2YXRlIHJlYWRvbmx5IElQdWxzYXJTZXJ2aWNlIF9wdWxzYXJTZXJ2aWNlOworCisgICAgcHVibGljIFRva2VuUmVmcmVzaFRlc3RzKElUZXN0T3V0cHV0SGVscGVyIG91dHB1dEhlbHBlciwgVG9rZW5DbHVzdGVyRml4dHVyZSBmaXh0dXJlKQorICAgIHsKKyAgICAgICAgX3Rlc3RPdXRwdXRIZWxwZXIgPSBvdXRwdXRIZWxwZXI7CisgICAgICAgIERlYnVnLkFzc2VydChmaXh0dXJlLlB1bHNhclNlcnZpY2UgIT0gbnVsbCwgImZpeHR1cmUuUHVsc2FyU2VydmljZSAhPSBudWxsIik7CisgICAgICAgIF9wdWxzYXJTZXJ2aWNlID0gZml4dHVyZS5QdWxzYXJTZXJ2aWNlOworICAgIH0KKworICAgIFtJbmxpbmVEYXRhKFRva2VuVGVzdFJlZnJlc2hUeXBlLlN0YW5kYXJkLCAwKV0gLy8gU3RhbmRhcmQgaGFwcHkgcGF0aCB3aXRoIG5vIHRva2VuIHJlZnJlc2ggZmFpbHVyZXMKKyAgICBbSW5saW5lRGF0YShUb2tlblRlc3RSZWZyZXNoVHlwZS5GYWlsQXRTdGFydHVwLCAxKV0gLy8gMSBGYWlsdXJlIGF0IHN0YXJ0dXAsIG5vdCBvbiByZWZyZXNoCisgICAgW0lubGluZURhdGEoVG9rZW5UZXN0UmVmcmVzaFR5cGUuRmFpbE9uUmVmcmVzaCwgMildIC8vIEZhaWxzIG9uIHJlZnJlc2ggd2hpY2ggd2lsbCBmb3JjZSBhIHJlY29ubmVjdGlvbiBhbmQgZmFpbCBvbmNlIG1vcmUgb24gbmV3IGNvbm5lY3Rpb24KKyAgICBbSW5saW5lRGF0YShUb2tlblRlc3RSZWZyZXNoVHlwZS5UaW1lb3V0T25SZWZyZXNoLCAwKV0gLy8gQ29ubmVjdGlvbiB3aWxsIGJlIGRpc2Nvbm5lY3RlZCBieSBzZXJ2ZXIgZHVlIHRvIHNsb3cgcmVzcG9uc2UgdG8gYXV0aCBjaGFsbGVuZ2UKKyAgICBbVGhlb3J5XQorICAgIHB1YmxpYyBhc3luYyBUYXNrIFRlc3RFeHBpcnlSZWZyZXNoKFRva2VuVGVzdFJlZnJlc2hUeXBlIHJlZnJlc2hUeXBlLCBpbnQgdGltZXNUb0ZhaWwpCisgICAgeworICAgICAgICB2YXIgaW5pdGlhbFJlZnJlc2hDb3VudCA9IERvdFB1bHNhckV2ZW50U291cmNlLkxvZy5Ub2tlblJlZnJlc2hDb3VudDsKKworICAgICAgICB2YXIgcHVibGlzaGluZ1N0YXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgdmFyIGRlbGF5ZWROYW1lcyA9IG5ldyBIYXNoU2V0PHN0cmluZz4oKTsKKyAgICAgICAgVGFzazxzdHJpbmc+IEdldFRva2VuKHN0cmluZyBuYW1lLCByZWYgaW50IGNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocmVmcmVzaFR5cGUgaXMgVG9rZW5UZXN0UmVmcmVzaFR5cGUuU3RhbmRhcmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEdldEF1dGhUb2tlbihuYW1lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJlZnJlc2hUeXBlIGlzIFRva2VuVGVzdFJlZnJlc2hUeXBlLkZhaWxBdFN0YXJ0dXAgJiYgIXB1Ymxpc2hpbmdTdGFydGVkICYmICsrY291bnQgPD0gdGltZXNUb0ZhaWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRnJvbUV4Y2VwdGlvbjxzdHJpbmc+KG5ldyBFeGNlcHRpb24oIkluaXRpYWwgVG9rZW4gRmFpbGVkIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmVmcmVzaFR5cGUgaXMgVG9rZW5UZXN0UmVmcmVzaFR5cGUuRmFpbE9uUmVmcmVzaCAmJiBwdWJsaXNoaW5nU3RhcnRlZCAmJiArK2NvdW50IDw9IHRpbWVzVG9GYWlsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUYXNrLkZyb21FeGNlcHRpb248c3RyaW5nPihjb3VudCA9PSAxID8gbmV3IEV4Y2VwdGlvbigiUmVmcmVzaCBGYWlsZWQiKSA6IG5ldyBFeGNlcHRpb24oIkluaXRpYWwgVG9rZW4gRmFpbGVkIikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmVmcmVzaFR5cGUgaXMgVG9rZW5UZXN0UmVmcmVzaFR5cGUuVGltZW91dE9uUmVmcmVzaCAmJiBwdWJsaXNoaW5nU3RhcnRlZCAmJiAhZGVsYXllZE5hbWVzLkNvbnRhaW5zKG5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlbGF5ZWROYW1lcy5BZGQobmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRhc2suRGVsYXkoNjAwMCkuQ29udGludWVXaXRoKF8gPT4gR2V0QXV0aFRva2VuKG5hbWUpKS5VbndyYXAoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIEdldEF1dGhUb2tlbihuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBwcm9kdWNlclRva2VuQ291bnQgPSAwOworICAgICAgICBhd2FpdCB1c2luZyB2YXIgcHJvZHVjZXJDbGllbnQgPSBHZXRQdWxzYXJDbGllbnQoIlByb2R1Y2VyIiwgKCkKKyAgICAgICAgICAgID0+IEdldFRva2VuKCJQcm9kdWNlciIsIHJlZiBwcm9kdWNlclRva2VuQ291bnQpKTsKKworICAgICAgICB2YXIgY29uc3VtZXJUb2tlbkNvdW50ID0gMDsKKyAgICAgICAgYXdhaXQgdXNpbmcgdmFyIGNvbnN1bWVyQ2xpZW50ID0gR2V0UHVsc2FyQ2xpZW50KCJDb25zdW1lciIsICgpCisgICAgICAgICAgICA9PiBHZXRUb2tlbigiQ29uc3VtZXIiLCByZWYgY29uc3VtZXJUb2tlbkNvdW50KSk7CisKKyAgICAgICAgdmFyIHByb2R1Y2VyID0gQ3JlYXRlUHJvZHVjZXIocHJvZHVjZXJDbGllbnQpOworCisgICAgICAgIHZhciBjb25zdW1lciA9IGNvbnN1bWVyQ2xpZW50Lk5ld0NvbnN1bWVyKFNjaGVtYS5TdHJpbmcpCisgICAgICAgICAgICAuVG9waWMoTXlUb3BpYykKKyAgICAgICAgICAgIC5TdWJzY3JpcHRpb25OYW1lKCJ0ZXN0LXN1YiIpCisgICAgICAgICAgICAuSW5pdGlhbFBvc2l0aW9uKFN1YnNjcmlwdGlvbkluaXRpYWxQb3NpdGlvbi5FYXJsaWVzdCkKKyAgICAgICAgICAgIC5DcmVhdGUoKTsKKworICAgICAgICB2YXIgcmVjZWl2ZWQgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICAgIGNvbnN0IGludCBtZXNzYWdlQ291bnQgPSAyMDsKKworICAgICAgICB2YXIgcHVibGlzaGVyVGFzayA9IFRhc2suUnVuKGFzeW5jICgpID0+CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVzc2FnZUNvdW50OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX3Rlc3RPdXRwdXRIZWxwZXIuV3JpdGVMaW5lKCJUcnlpbmcgdG8gcHVibGlzaCBtZXNzYWdlIGZvciBpbmRleCB7MH0iLCBpKTsKKyAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZUlkID0gYXdhaXQgcHJvZHVjZXIuU2VuZChFbmNvZGluZy5VVEY4LkdldEJ5dGVzKGkuVG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgIHB1Ymxpc2hpbmdTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBfdGVzdE91dHB1dEhlbHBlci5Xcml0ZUxpbmUoIlB1Ymxpc2hlZCBtZXNzYWdlIHswfSBmb3IgaW5kZXggezF9IiwgbWVzc2FnZUlkLCBpKTsKKworICAgICAgICAgICAgICAgIGF3YWl0IFRhc2suRGVsYXkoMTAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHZhciBjb25zdW1lclRhc2sgPSBUYXNrLlJ1bihhc3luYyAoKSA9PgorICAgICAgICB7CisgICAgICAgICAgICBhd2FpdCBjb25zdW1lci5PblN0YXRlQ2hhbmdlVG8oQ29uc3VtZXJTdGF0ZS5BY3RpdmUpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtZXNzYWdlQ291bnQ7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgbWVzc2FnZSA9IGF3YWl0IGNvbnN1bWVyLlJlY2VpdmUoKTsKKyAgICAgICAgICAgICAgICByZWNlaXZlZC5BZGQoRW5jb2RpbmcuVVRGOC5HZXRTdHJpbmcobWVzc2FnZS5EYXRhKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHZhciBhbGwgPSBUYXNrLldoZW5BbGwoY29uc3VtZXJUYXNrLCBwdWJsaXNoZXJUYXNrKTsKKyAgICAgICAgdmFyIHRpbWVvdXRUYXNrID0gVGFzay5EZWxheSg2MF8wMDApOworICAgICAgICB2YXIgcmVzdWx0ID0gYXdhaXQgVGFzay5XaGVuQW55KGFsbCwgdGltZW91dFRhc2spOworICAgICAgICBBc3NlcnQuVHJ1ZShyZXN1bHQgIT0gdGltZW91dFRhc2spOworCisgICAgICAgIGlmIChyZWZyZXNoVHlwZSBpcyBUb2tlblRlc3RSZWZyZXNoVHlwZS5TdGFuZGFyZCkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LlRydWUoRG90UHVsc2FyRXZlbnRTb3VyY2UuTG9nLlRva2VuUmVmcmVzaENvdW50ID4gaW5pdGlhbFJlZnJlc2hDb3VudCk7CisgICAgICAgIH0KKworICAgICAgICB2YXIgZXhwZWN0ZWQgPSBFbnVtZXJhYmxlLlJhbmdlKDAsIG1lc3NhZ2VDb3VudCkuU2VsZWN0KGkgPT4gaS5Ub1N0cmluZygpKS5Ub0xpc3QoKTsKKyAgICAgICAgdmFyIG1pc3NpbmcgPSBleHBlY3RlZC5FeGNlcHQocmVjZWl2ZWQpLlRvTGlzdCgpOworCisgICAgICAgIGlmIChtaXNzaW5nLkNvdW50ID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LlRydWUoZmFsc2UsICQiTWlzc2luZyB2YWx1ZXM6IHtzdHJpbmcuSm9pbigiLCIsIG1pc3NpbmcpfSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSVByb2R1Y2VyPFJlYWRPbmx5U2VxdWVuY2U8Ynl0ZT4+IENyZWF0ZVByb2R1Y2VyKElQdWxzYXJDbGllbnQgcHJvZHVjZXJDbGllbnQpCisgICAgICAgID0+IHByb2R1Y2VyQ2xpZW50Lk5ld1Byb2R1Y2VyKCkKKyAgICAgICAgICAgIC5Ub3BpYyhNeVRvcGljKQorICAgICAgICAgICAgLkNyZWF0ZSgpOworCisgICAgcHJpdmF0ZSBJUHVsc2FyQ2xpZW50IEdldFB1bHNhckNsaWVudChzdHJpbmcgbmFtZSwgRnVuYzxUYXNrPHN0cmluZz4+IHRva2VuRmFjdG9yeSkKKyAgICAgICAgPT4gUHVsc2FyQ2xpZW50LkJ1aWxkZXIoKQorICAgICAgICAgICAgLkF1dGhlbnRpY2F0ZVVzaW5nVG9rZW4odG9rZW5GYWN0b3J5KQorICAgICAgICAgICAgLlJldHJ5SW50ZXJ2YWwoVGltZVNwYW4uRnJvbVNlY29uZHMoMSkpCisgICAgICAgICAgICAuRXhjZXB0aW9uSGFuZGxlcihlYyA9PiBfdGVzdE91dHB1dEhlbHBlci5Xcml0ZUxpbmUoIkVycm9yIChoYW5kbGVkPXswfSkgb2NjdXJyZWQgaW4gezF9IGNsaWVudDogezJ9IiwgZWMuRXhjZXB0aW9uSGFuZGxlZCwgbmFtZSwgZWMuRXhjZXB0aW9uKSkKKyAgICAgICAgICAgIC5TZXJ2aWNlVXJsKF9wdWxzYXJTZXJ2aWNlLkdldEJyb2tlclVyaSgpKS5CdWlsZCgpOworCisgICAgcHJpdmF0ZSBhc3luYyBUYXNrPHN0cmluZz4gR2V0QXV0aFRva2VuKHN0cmluZyBuYW1lKQorICAgIHsKKyAgICAgICAgdmFyIHJlc3VsdCA9IGF3YWl0IFRva2VuQ2x1c3RlckZpeHR1cmUuR2V0QXV0aFRva2VuKHRydWUpOworICAgICAgICBfdGVzdE91dHB1dEhlbHBlci5Xcml0ZUxpbmUoInswfSByZWNlaXZlZCB0b2tlbiB7MX0iLCBuYW1lLCByZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL2FwcGRhdGEvbXktc2VjcmV0LmtleSBiL3Rlc3RzL0RvdFB1bHNhci5JbnRlZ3JhdGlvblRlc3RzL2FwcGRhdGEvbXktc2VjcmV0LmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTdhMzU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMvYXBwZGF0YS9teS1zZWNyZXQua2V5CkBAIC0wLDAgKzEsMiBAQAorG/vwT4Ghw/UKK6yiqm0JDKb92200w3gjmSOodm4h94/lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMvZG9ja2VyLWNvbXBvc2Utc3RhbmRhbG9uZS10ZXN0cy55bWwgYi90ZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy9kb2NrZXItY29tcG9zZS1zdGFuZGFsb25lLXRlc3RzLnltbAppbmRleCBhMzY0MmVjLi4wZTUxN2U1IDEwMDY0NAotLS0gYS90ZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy9kb2NrZXItY29tcG9zZS1zdGFuZGFsb25lLXRlc3RzLnltbAorKysgYi90ZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy9kb2NrZXItY29tcG9zZS1zdGFuZGFsb25lLXRlc3RzLnltbApAQCAtMTIsMyArMTIsMTAgQEAKICAgICAgIFBVTFNBUl9NRU06ICIgLVhtczFnIC1YbXgxZyAtWFg6TWF4RGlyZWN0TWVtb3J5U2l6ZT0yZyIKICAgICBjb21tYW5kOiB8CiAgICAgICAvYmluL2Jhc2ggLWMgImJpbi9hcHBseS1jb25maWctZnJvbS1lbnYucHkgY29uZi9zdGFuZGFsb25lLmNvbmYgJiYgYmluL3B1bHNhciBzdGFuZGFsb25lIC0tbm8tZnVuY3Rpb25zLXdvcmtlciIKKyAgICBuZXR3b3JrczoKKyAgICAgIC0gcHVsc2FyLXN0YW5kYWxvbmUKKyAgICAgICAgCituZXR3b3JrczoKKyAgcHVsc2FyLXN0YW5kYWxvbmU6CisgICAgbmFtZTogcHVsc2FyLXN0YW5kYWxvbmUKKyAgICBkcml2ZXI6IGJyaWRnZQpkaWZmIC0tZ2l0IGEvdGVzdHMvRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMvZG9ja2VyLWNvbXBvc2Utc3RhbmRhbG9uZS10b2tlbi10ZXN0cy55bWwgYi90ZXN0cy9Eb3RQdWxzYXIuSW50ZWdyYXRpb25UZXN0cy9kb2NrZXItY29tcG9zZS1zdGFuZGFsb25lLXRva2VuLXRlc3RzLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjc2YzViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMvZG9ja2VyLWNvbXBvc2Utc3RhbmRhbG9uZS10b2tlbi10ZXN0cy55bWwKQEAgLTAsMCArMSwzNCBAQAor77u/dmVyc2lvbjogJzMuNScKKyAgCitzZXJ2aWNlczoKKyAgICAgICAgCisgIHB1bHNhci10b2tlbnM6CisgICAgY29udGFpbmVyX25hbWU6IHB1bHNhci10b2tlbnMKKyAgICBpbWFnZTogJ2FwYWNoZXB1bHNhci9wdWxzYXI6Mi43LjAnCisgICAgcG9ydHM6CisgICAgICAtICc1NDU0ODo4MDgxJworICAgICAgLSAnNTQ1NDc6NjY1MScKKyAgICB2b2x1bWVzOgorICAgICAgLSAuL2FwcGRhdGEvOi9hcHBkYXRhCisgICAgZW52aXJvbm1lbnQ6CisgICAgICAtIFBVTFNBUl9QUkVGSVhfdG9rZW5TZWNyZXRLZXk9ZmlsZTovLy9hcHBkYXRhL215LXNlY3JldC5rZXkKKyAgICAgIC0gYXV0aGVudGljYXRpb25FbmFibGVkPXRydWUKKyAgICAgIC0gYXV0aG9yaXphdGlvbkVuYWJsZWQ9dHJ1ZQorICAgICAgLSBhdXRoZW50aWNhdGlvblByb3ZpZGVycz1vcmcuYXBhY2hlLnB1bHNhci5icm9rZXIuYXV0aGVudGljYXRpb24uQXV0aGVudGljYXRpb25Qcm92aWRlclRva2VuCisgICAgICAtIGF1dGhlbnRpY2F0ZU9yaWdpbmFsQXV0aERhdGE9ZmFsc2UKKyAgICAgIC0gYnJva2VyQ2xpZW50QXV0aGVudGljYXRpb25QbHVnaW49b3JnLmFwYWNoZS5wdWxzYXIuY2xpZW50LmltcGwuYXV0aC5BdXRoZW50aWNhdGlvblRva2VuCisgICAgICAtIGJyb2tlckNsaWVudEF1dGhlbnRpY2F0aW9uUGFyYW1ldGVycz10b2tlbjpleUpoYkdjaU9pSklVekkxTmlKOS5leUp6ZFdJaU9pSjBaWE4wTFhWelpYSWlmUS5Db0JyamExRUhyMGUya1pLR0ZTOE0teFMyU09DMkUwOHlabWprdHZjWU9zCisgICAgICAtIHN1cGVyVXNlclJvbGVzPXRlc3QtdXNlcgorICAgICAgLSBQVUxTQVJfUFJFRklYX2F1dGhlbnRpY2F0aW9uUmVmcmVzaENoZWNrU2Vjb25kcz01CisgICAgICAtIHdlYlNlcnZpY2VQb3J0PTgwODEKKyAgICAgIC0gYnJva2VyU2VydmljZVBvcnQ9NjY1MQorIyAgICAgIC0gUFVMU0FSX0xPR19MRVZFTD1kZWJ1ZworICAgIGNvbW1hbmQ6IHwKKyAgICAgIC9iaW4vYmFzaCAtYyAiYmluL2FwcGx5LWNvbmZpZy1mcm9tLWVudi5weSBjb25mL3N0YW5kYWxvbmUuY29uZiAmJiBiaW4vcHVsc2FyIHN0YW5kYWxvbmUgLS1uby1mdW5jdGlvbnMtd29ya2VyIgorICAgIG5ldHdvcmtzOgorICAgICAgLSBwdWxzYXItdG9rZW5zCisgICAgICAgIAorbmV0d29ya3M6CisgIHB1bHNhci10b2tlbnM6CisgICAgbmFtZTogcHVsc2FyLXRva2VucworICAgIGRyaXZlcjogYnJpZGdlCmRpZmYgLS1naXQgYS90ZXN0cy9Eb3RQdWxzYXIuU3RyZXNzVGVzdHMvRG90UHVsc2FyLlN0cmVzc1Rlc3RzLmNzcHJvaiBiL3Rlc3RzL0RvdFB1bHNhci5TdHJlc3NUZXN0cy9Eb3RQdWxzYXIuU3RyZXNzVGVzdHMuY3Nwcm9qCmluZGV4IGFiZjFkMTQuLjU1MjQ5MDAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL0RvdFB1bHNhci5TdHJlc3NUZXN0cy9Eb3RQdWxzYXIuU3RyZXNzVGVzdHMuY3Nwcm9qCisrKyBiL3Rlc3RzL0RvdFB1bHNhci5TdHJlc3NUZXN0cy9Eb3RQdWxzYXIuU3RyZXNzVGVzdHMuY3Nwcm9qCkBAIC0yNiw2ICsyNiw3IEBACiAKICAgPEl0ZW1Hcm91cD4KICAgICA8UHJvamVjdFJlZmVyZW5jZSBJbmNsdWRlPSIuLlwuLlxzcmNcRG90UHVsc2FyXERvdFB1bHNhci5jc3Byb2oiIC8+CisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHNcRG90UHVsc2FyLkludGVncmF0aW9uVGVzdHMuY3Nwcm9qIiAvPgogICA8L0l0ZW1Hcm91cD4KIAogPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvRG90UHVsc2FyLlN0cmVzc1Rlc3RzL0ZpeHR1cmVzL1N0YW5kYWxvbmVDbHVzdGVyRml4dHVyZS5jcyBiL3Rlc3RzL0RvdFB1bHNhci5TdHJlc3NUZXN0cy9GaXh0dXJlcy9TdGFuZGFsb25lQ2x1c3RlckZpeHR1cmUuY3MKaW5kZXggZWY3MzIxYy4uNTAwY2Q4NCAxMDA2NDQKLS0tIGEvdGVzdHMvRG90UHVsc2FyLlN0cmVzc1Rlc3RzL0ZpeHR1cmVzL1N0YW5kYWxvbmVDbHVzdGVyRml4dHVyZS5jcworKysgYi90ZXN0cy9Eb3RQdWxzYXIuU3RyZXNzVGVzdHMvRml4dHVyZXMvU3RhbmRhbG9uZUNsdXN0ZXJGaXh0dXJlLmNzCkBAIC0xNCwxOSArMTQsMjkgQEAKIAogbmFtZXNwYWNlIERvdFB1bHNhci5TdHJlc3NUZXN0cy5GaXh0dXJlczsKIAordXNpbmcgSW50ZWdyYXRpb25UZXN0czsKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5EaWFnbm9zdGljczsKIHVzaW5nIFN5c3RlbS5OZXQuSHR0cDsKIHVzaW5nIFN5c3RlbS5UaHJlYWRpbmcuVGFza3M7CiB1c2luZyBYdW5pdDsKK3VzaW5nIFh1bml0LkFic3RyYWN0aW9uczsKK3VzaW5nIFh1bml0LlNkazsKIAogcHVibGljIGNsYXNzIFN0YW5kYWxvbmVDbHVzdGVyRml4dHVyZSA6IElBc3luY0xpZmV0aW1lCiB7CisgICAgcHJpdmF0ZSByZWFkb25seSBJTWVzc2FnZVNpbmsgX21lc3NhZ2VTaW5rOworCisgICAgcHVibGljIFN0YW5kYWxvbmVDbHVzdGVyRml4dHVyZShJTWVzc2FnZVNpbmsgbWVzc2FnZVNpbmspCisgICAgeworICAgICAgICBfbWVzc2FnZVNpbmsgPSBtZXNzYWdlU2luazsKKyAgICB9CisKICAgICBwdWJsaWMgYXN5bmMgVGFzayBJbml0aWFsaXplQXN5bmMoKQogICAgIHsKLSAgICAgICAgVGFrZURvd25QdWxzYXIoKTsgLy8gY2xlYW4tdXAgaWYgYW55dGhpbmcgd2FzIGxlZnQgcnVubmluZyBmcm9tIHByZXZpb3VzIHJ1bgorICAgICAgICBhd2FpdCBUYWtlRG93blB1bHNhcigpOyAvLyBjbGVhbi11cCBpZiBhbnl0aGluZyB3YXMgbGVmdCBydW5uaW5nIGZyb20gcHJldmlvdXMgcnVuCiAKLSAgICAgICAgUnVuUHJvY2VzcygiZG9ja2VyLWNvbXBvc2UiLCAiLWYgZG9ja2VyLWNvbXBvc2Utc3RhbmRhbG9uZS10ZXN0cy55bWwgdXAgLWQiKTsKKyAgICAgICAgYXdhaXQgUHJvY2Vzc0FzeW5jSGVscGVyLkV4ZWN1dGVTaGVsbENvbW1hbmQoImRvY2tlci1jb21wb3NlIiwgIi1mIGRvY2tlci1jb21wb3NlLXN0YW5kYWxvbmUtdGVzdHMueW1sIHVwIC1kIikKKyAgICAgICAgICAgIC5UaHJvd09uRmFpbHVyZSgpOwogCiAgICAgICAgIHZhciB3YWl0VHJpZXMgPSAxMDsKIApAQCAtNTQsMzQgKzY0LDE5IEBACiAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVuYWJsZSB0byBjb25maXJtIFB1bHNhciBoYXMgaW5pdGlhbGl6ZWQiKTsKICAgICB9CiAKLSAgICBwdWJsaWMgVGFzayBEaXNwb3NlQXN5bmMoKQorICAgIHB1YmxpYyBhc3luYyBUYXNrIERpc3Bvc2VBc3luYygpCiAgICAgewotICAgICAgICBUYWtlRG93blB1bHNhcigpOwotICAgICAgICByZXR1cm4gVGFzay5Db21wbGV0ZWRUYXNrOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVGFrZURvd25QdWxzYXIoKQotICAgICAgICA9PiBSdW5Qcm9jZXNzKCJkb2NrZXItY29tcG9zZSIsICItZiBkb2NrZXItY29tcG9zZS1zdGFuZGFsb25lLXRlc3RzLnltbCBkb3duIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFJ1blByb2Nlc3Moc3RyaW5nIG5hbWUsIHN0cmluZyBhcmd1bWVudHMpCi0gICAgewotICAgICAgICB2YXIgcHJvY2Vzc1N0YXJ0SW5mbyA9IG5ldyBQcm9jZXNzU3RhcnRJbmZvCisgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlTmFtZSA9IG5hbWUsCi0gICAgICAgICAgICBBcmd1bWVudHMgPSBhcmd1bWVudHMKLSAgICAgICAgfTsKLQotICAgICAgICBwcm9jZXNzU3RhcnRJbmZvLkVudmlyb25tZW50WyJUQUciXSA9ICJ0ZXN0IjsKLSAgICAgICAgcHJvY2Vzc1N0YXJ0SW5mby5FbnZpcm9ubWVudFsiQ09ORklHVVJBVElPTiJdID0gIkRlYnVnIjsKLSAgICAgICAgcHJvY2Vzc1N0YXJ0SW5mby5FbnZpcm9ubWVudFsiQ09NUFVURVJOQU1FIl0gPSBFbnZpcm9ubWVudC5NYWNoaW5lTmFtZTsKLQotICAgICAgICB2YXIgcHJvY2VzcyA9IFByb2Nlc3MuU3RhcnQocHJvY2Vzc1N0YXJ0SW5mbyk7Ci0gICAgICAgIGlmIChwcm9jZXNzIGlzIG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJQcm9jZXNzLlN0YXJ0IHJldHVybmVkIG51bGwiKTsKLQotICAgICAgICBwcm9jZXNzLldhaXRGb3JFeGl0KCk7Ci0KLSAgICAgICAgaWYgKHByb2Nlc3MuRXhpdENvZGUgIT0gMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJCJFeGl0IGNvZGUge3Byb2Nlc3MuRXhpdENvZGV9IHdoZW4gcnVubmluZyBwcm9jZXNzIHtuYW1lfSB3aXRoIGFyZ3VtZW50cyB7YXJndW1lbnRzfSIpOworICAgICAgICAgICAgYXdhaXQgVGFrZURvd25QdWxzYXIoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIF9tZXNzYWdlU2luay5Pbk1lc3NhZ2UobmV3IERpYWdub3N0aWNNZXNzYWdlKCJFcnJvciB0YWtpbmcgZG93biBwdWxzYXI6IHswfSIsIGUpKTsKKyAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgVGFzayBUYWtlRG93blB1bHNhcigpCisgICAgICAgID0+IFByb2Nlc3NBc3luY0hlbHBlci5FeGVjdXRlU2hlbGxDb21tYW5kKCJkb2NrZXItY29tcG9zZSIsICItZiBkb2NrZXItY29tcG9zZS1zdGFuZGFsb25lLXRlc3RzLnltbCBkb3duIikKKyAgICAgICAgICAgIC5Mb2dGYWlsdXJlKHMgPT4gX21lc3NhZ2VTaW5rLk9uTWVzc2FnZShuZXcgRGlhZ25vc3RpY01lc3NhZ2UoIkVycm9yIGJyaW5naW5nIGRvd24gY29udGFpbmVyOiB7MH0iLCBzKSkpOwogfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZG9ja2VyLWNvbXBvc2Utc3RhbmRhbG9uZS10ZXN0cy55bWwgYi90ZXN0cy9kb2NrZXItY29tcG9zZS1zdGFuZGFsb25lLXRlc3RzLnltbAppbmRleCBiOWIzY2Q5Li5iY2EzOTk5IDEwMDY0NAotLS0gYS90ZXN0cy9kb2NrZXItY29tcG9zZS1zdGFuZGFsb25lLXRlc3RzLnltbAorKysgYi90ZXN0cy9kb2NrZXItY29tcG9zZS1zdGFuZGFsb25lLXRlc3RzLnltbApAQCAtMTIsNiArMTIsOCBAQAogICAgICAgUFVMU0FSX01FTTogIiAtWG1zMWcgLVhteDFnIC1YWDpNYXhEaXJlY3RNZW1vcnlTaXplPTJnIgogICAgIGNvbW1hbmQ6IHwKICAgICAgIC9iaW4vYmFzaCAtYyAiYmluL2FwcGx5LWNvbmZpZy1mcm9tLWVudi5weSBjb25mL3N0YW5kYWxvbmUuY29uZiAmJiBiaW4vcHVsc2FyIHN0YW5kYWxvbmUgLS1uby1mdW5jdGlvbnMtd29ya2VyIgorICAgIG5ldHdvcmtzOgorICAgICAgLSBwdWxzYXItc3RyZXNzdGVzdHMKIAogICBsb2FkYmFsYW5jZXI6CiAgICAgY29udGFpbmVyX25hbWU6IGxvYWRiYWxhbmNlcgpAQCAtMjUsMyArMjcsMTAgQEAKICAgICAgIC0gLi9oYXByb3h5LmNmZzovdXNyL2xvY2FsL2V0Yy9oYXByb3h5L2hhcHJveHkuY2ZnOnJvCiAgICAgZGVwZW5kc19vbjoKICAgICAgIC0gcHVsc2FyCisgICAgbmV0d29ya3M6CisgICAgICAtIHB1bHNhci1zdHJlc3N0ZXN0cworCituZXR3b3JrczoKKyAgcHVsc2FyLXN0cmVzc3Rlc3RzOgorICAgIG5hbWU6IHB1bHNhci1zdHJlc3N0ZXN0cworICAgIGRyaXZlcjogYnJpZGdlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=