ZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0FTVENvbnZlcnRlckFTVDNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9BU1RDb252ZXJ0ZXJBU1QzVGVzdC5qYXZhCmluZGV4IGFhZWNkYzQuLjkxMzYxYzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0FTVENvbnZlcnRlckFTVDNUZXN0LmphdmEKKysrIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQVNUQ29udmVydGVyQVNUM1Rlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNSw4ICsxNSw4IEBACiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRVbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRQcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUphdmFTY3JpcHRVbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdENvcmU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0TW9kZWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQVNUOwpAQCAtMzIsMTEgKzMyLDkgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQnJlYWtTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ2FzdEV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ2F0Y2hDbGF1c2U7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ2hhcmFjdGVyTGl0ZXJhbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5DbGFzc0luc3RhbmNlQ3JlYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uSmF2YVNjcmlwdFVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ29uZGl0aW9uYWxFeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkNvbnRpbnVlU3RhdGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkRvU3RhdGVtZW50OwpAQCAtNDYsNiArNDQsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkZpZWxkQWNjZXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uRm9yU3RhdGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkZ1bmN0aW9uRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uRnVuY3Rpb25JbnZvY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLklCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLklGdW5jdGlvbkJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uSVBhY2thZ2VCaW5kaW5nOwpAQCAtNTcsOSArNTcsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkluaXRpYWxpemVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkluc3RhbmNlb2ZFeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkpTZG9jOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkphdmFTY3JpcHRVbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkxhYmVsZWRTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uRnVuY3Rpb25EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5GdW5jdGlvbkludm9jYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uTW9kaWZpZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uTmFtZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5OdWxsTGl0ZXJhbDsKQEAgLTcwNCwxNjMgKzcwMyw2IEBACiAJfQogCiAJLyoqCi0JICogKFN0cmluZykgbzsgPT0+IEV4cHJlc3Npb25TdGF0ZW1lbnQoQ2FzdEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMzEoKSB0aHJvd3MgSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFTY3JpcHRVbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAic3JjIiwgInRlc3QwMDMxIiwgIlRlc3QuanMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oQVNULkpMUzMsIHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoSmF2YVNjcmlwdFVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCgpOwotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0TmFtZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJzIikpOyAvLyROT04tTkxTLTEkCi0JCUNhc3RFeHByZXNzaW9uIGNhc3RFeHByZXNzaW9uID0gdGhpcy5hc3QubmV3Q2FzdEV4cHJlc3Npb24oKTsKLQkJY2FzdEV4cHJlc3Npb24uc2V0RXhwcmVzc2lvbih0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJvIikpOy8vJE5PTi1OTFMtMSQKLQkJY2FzdEV4cHJlc3Npb24uc2V0VHlwZSh0aGlzLmFzdC5uZXdTaW1wbGVUeXBlKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoIlN0cmluZyIpKSk7Ly8kTk9OLU5MUy0xJAotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoY2FzdEV4cHJlc3Npb24pOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3U2ltcGxlVHlwZSh0aGlzLmFzdC5uZXdTaW1wbGVOYW1lKCJTdHJpbmciKSkpOy8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJTdHJpbmcgcyA9IChTdHJpbmcpIG87Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCQkJCQkKLQotCS8qKgotCSAqIChpbnQpIGQ7ID09PiBFeHByZXNzaW9uU3RhdGVtZW50KENhc3RFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QwMDMyKCkgdGhyb3dzIEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlKYXZhU2NyaXB0VW5pdCBzb3VyY2VVbml0ID0gZ2V0Q29tcGlsYXRpb25Vbml0KCJDb252ZXJ0ZXIiICwgInNyYyIsICJ0ZXN0MDAzMiIsICJUZXN0LmpzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJY2hhcltdIHNvdXJjZSA9IHNvdXJjZVVuaXQuZ2V0U291cmNlKCkudG9DaGFyQXJyYXkoKTsKLQkJQVNUTm9kZSByZXN1bHQgPSBydW5Db252ZXJzaW9uKEFTVC5KTFMzLCBzb3VyY2VVbml0LCBmYWxzZSk7Ci0JCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoKEphdmFTY3JpcHRVbml0KSByZXN1bHQsIDAsIDAsIDEpOwotCQlhc3NlcnROb3ROdWxsKCJFeHByZXNzaW9uIHNob3VsZCBub3QgYmUgbnVsbCIsIG5vZGUpOyAvLyROT04tTkxTLTEkCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0Nhc3RFeHByZXNzaW9uKCk7Ci0JCWNhc3RFeHByZXNzaW9uLnNldEV4cHJlc3Npb24odGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiZCIpKTsvLyROT04tTkxTLTEkCi0JCWNhc3RFeHByZXNzaW9uLnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCkpOy8vJE5PTi1OTFMtMSQKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKGNhc3RFeHByZXNzaW9uKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5JTlQpKTsvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIkJvdGggQVNUIHRyZWVzIHNob3VsZCBiZSBpZGVudGljYWwiLCBzdGF0ZW1lbnQuc3VidHJlZU1hdGNoKG5ldyBBU1RNYXRjaGVyKCksIG5vZGUpKTsJCS8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiaW50IGkgPSAoaW50KSBkOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9CQotCQotCS8qKgotCSAqIChmbG9hdCkgZDsgPT0+IEV4cHJlc3Npb25TdGF0ZW1lbnQoQ2FzdEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMzMoKSB0aHJvd3MgSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFTY3JpcHRVbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAic3JjIiwgInRlc3QwMDMzIiwgIlRlc3QuanMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oQVNULkpMUzMsIHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoSmF2YVNjcmlwdFVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImYiKSk7IC8vJE5PTi1OTFMtMSQKLQkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdDYXN0RXhwcmVzc2lvbigpOwotCQljYXN0RXhwcmVzc2lvbi5zZXRFeHByZXNzaW9uKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImQiKSk7Ly8kTk9OLU5MUy0xJAotCQljYXN0RXhwcmVzc2lvbi5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5GTE9BVCkpOy8vJE5PTi1OTFMtMSQKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKGNhc3RFeHByZXNzaW9uKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5GTE9BVCkpOy8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImZsb2F0IGYgPSAoZmxvYXQpIGQ7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0KLQkvKioKLQkgKiAoYnl0ZSkgZDsgPT0+IEV4cHJlc3Npb25TdGF0ZW1lbnQoQ2FzdEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMzQoKSB0aHJvd3MgSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFTY3JpcHRVbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAic3JjIiwgInRlc3QwMDM0IiwgIlRlc3QuanMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oQVNULkpMUzMsIHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoSmF2YVNjcmlwdFVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdDYXN0RXhwcmVzc2lvbigpOwotCQljYXN0RXhwcmVzc2lvbi5zZXRFeHByZXNzaW9uKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImQiKSk7Ly8kTk9OLU5MUy0xJAotCQljYXN0RXhwcmVzc2lvbi5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5CWVRFKSk7Ly8kTk9OLU5MUy0xJAotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoY2FzdEV4cHJlc3Npb24pOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkJZVEUpKTsvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJieXRlIGIgPSAoYnl0ZSkgZDsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkKLQotCS8qKgotCSAqIChzaG9ydCkgZDsgPT0+IEV4cHJlc3Npb25TdGF0ZW1lbnQoQ2FzdEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMzUoKSB0aHJvd3MgSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFTY3JpcHRVbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAic3JjIiwgInRlc3QwMDM1IiwgIlRlc3QuanMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oQVNULkpMUzMsIHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoSmF2YVNjcmlwdFVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoInMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdDYXN0RXhwcmVzc2lvbigpOwotCQljYXN0RXhwcmVzc2lvbi5zZXRFeHByZXNzaW9uKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImQiKSk7Ly8kTk9OLU5MUy0xJAotCQljYXN0RXhwcmVzc2lvbi5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5TSE9SVCkpOy8vJE5PTi1OTFMtMSQKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldEluaXRpYWxpemVyKGNhc3RFeHByZXNzaW9uKTsKLQkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBzdGF0ZW1lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50KHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCk7Ci0JCXN0YXRlbWVudC5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5TSE9SVCkpOy8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgInNob3J0IHMgPSAoc2hvcnQpIGQ7Iiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIChsb25nKSBkOyA9PT4gRXhwcmVzc2lvblN0YXRlbWVudChDYXN0RXhwcmVzc2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MDAzNigpIHRocm93cyBKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gewotCQlJSmF2YVNjcmlwdFVuaXQgc291cmNlVW5pdCA9IGdldENvbXBpbGF0aW9uVW5pdCgiQ29udmVydGVyIiAsICJzcmMiLCAidGVzdDAwMzYiLCAiVGVzdC5qcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCWNoYXJbXSBzb3VyY2UgPSBzb3VyY2VVbml0LmdldFNvdXJjZSgpLnRvQ2hhckFycmF5KCk7Ci0JCUFTVE5vZGUgcmVzdWx0ID0gcnVuQ29udmVyc2lvbihBU1QuSkxTMywgc291cmNlVW5pdCwgZmFsc2UpOwotCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKChKYXZhU2NyaXB0VW5pdCkgcmVzdWx0LCAwLCAwLCAxKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRXhwcmVzc2lvbiBzaG91bGQgbm90IGJlIG51bGwiLCBub2RlKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSB0aGlzLmFzdC5uZXdWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQoKTsKLQkJdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50LnNldE5hbWUodGhpcy5hc3QubmV3U2ltcGxlTmFtZSgibCIpKTsgLy8kTk9OLU5MUy0xJAotCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IHRoaXMuYXN0Lm5ld0Nhc3RFeHByZXNzaW9uKCk7Ci0JCWNhc3RFeHByZXNzaW9uLnNldEV4cHJlc3Npb24odGhpcy5hc3QubmV3U2ltcGxlTmFtZSgiZCIpKTsvLyROT04tTkxTLTEkCi0JCWNhc3RFeHByZXNzaW9uLnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkxPTkcpKTsvLyROT04tTkxTLTEkCi0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXRJbml0aWFsaXplcihjYXN0RXhwcmVzc2lvbik7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgc3RhdGVtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCh2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpOwotCQlzdGF0ZW1lbnQuc2V0VHlwZSh0aGlzLmFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuTE9ORykpOy8vJE5PTi1OTFMtMSQKLQotCQlhc3NlcnRUcnVlKCJCb3RoIEFTVCB0cmVlcyBzaG91bGQgYmUgaWRlbnRpY2FsIiwgc3RhdGVtZW50LnN1YnRyZWVNYXRjaChuZXcgQVNUTWF0Y2hlcigpLCBub2RlKSk7CQkvLyROT04tTkxTLTEkCi0JCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImxvbmcgbCA9IChsb25nKSBkOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAoY2hhcikgaTsgPT0+IEV4cHJlc3Npb25TdGF0ZW1lbnQoQ2FzdEV4cHJlc3Npb24pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDAwMzcoKSB0aHJvd3MgSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFTY3JpcHRVbml0IHNvdXJjZVVuaXQgPSBnZXRDb21waWxhdGlvblVuaXQoIkNvbnZlcnRlciIgLCAic3JjIiwgInRlc3QwMDM3IiwgIlRlc3QuanMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQljaGFyW10gc291cmNlID0gc291cmNlVW5pdC5nZXRTb3VyY2UoKS50b0NoYXJBcnJheSgpOwotCQlBU1ROb2RlIHJlc3VsdCA9IHJ1bkNvbnZlcnNpb24oQVNULkpMUzMsIHNvdXJjZVVuaXQsIGZhbHNlKTsKLQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSgoSmF2YVNjcmlwdFVuaXQpIHJlc3VsdCwgMCwgMCwgMSk7Ci0JCWFzc2VydE5vdE51bGwoIkV4cHJlc3Npb24gc2hvdWxkIG5vdCBiZSBudWxsIiwgbm9kZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50ID0gdGhpcy5hc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7Ci0JCXZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5zZXROYW1lKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSB0aGlzLmFzdC5uZXdDYXN0RXhwcmVzc2lvbigpOwotCQljYXN0RXhwcmVzc2lvbi5zZXRFeHByZXNzaW9uKHRoaXMuYXN0Lm5ld1NpbXBsZU5hbWUoImkiKSk7Ly8kTk9OLU5MUy0xJAotCQljYXN0RXhwcmVzc2lvbi5zZXRUeXBlKHRoaXMuYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5DSEFSKSk7Ly8kTk9OLU5MUy0xJAotCQl2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuc2V0SW5pdGlhbGl6ZXIoY2FzdEV4cHJlc3Npb24pOwotCQlWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IHN0YXRlbWVudCA9IHRoaXMuYXN0Lm5ld1ZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQodmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJc3RhdGVtZW50LnNldFR5cGUodGhpcy5hc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLkNIQVIpKTsvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0VHJ1ZSgiQm90aCBBU1QgdHJlZXMgc2hvdWxkIGJlIGlkZW50aWNhbCIsIHN0YXRlbWVudC5zdWJ0cmVlTWF0Y2gobmV3IEFTVE1hdGNoZXIoKSwgbm9kZSkpOwkJLy8kTk9OLU5MUy0xJAotCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJjaGFyIGMgPSAoY2hhcikgaTsiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JfQkKLQotCS8qKgogCSAqIGludC5jbGFzczsgPT0+IEV4cHJlc3Npb25TdGF0ZW1lbnQoVHlwZUxpdGVyYWwpCiAJICovCiAJcHVibGljIHZvaWQgdGVzdDAwMzgoKSB0aHJvd3MgSmF2YVNjcmlwdE1vZGVsRXhjZXB0aW9uIHsKQEAgLTU5NjcsMTMgKzU4MDksNiBAQAogCQlGdW5jdGlvbkludm9jYXRpb24gbWV0aG9kSW52b2NhdGlvbiA9IChGdW5jdGlvbkludm9jYXRpb24pIGV4cHJlc3Npb247CiAJCUxpc3QgYXJndW1lbnRzID0gbWV0aG9kSW52b2NhdGlvbi5hcmd1bWVudHMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgYXJndW1lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IChFeHByZXNzaW9uKSBhcmd1bWVudHMuZ2V0KDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBDYXN0RXhwcmVzc2lvbiIsIGV4cHJlc3Npb24yIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUNhc3RFeHByZXNzaW9uIGNhc3RFeHByZXNzaW9uID0gKENhc3RFeHByZXNzaW9uKSBleHByZXNzaW9uMjsKLQkJVHlwZSB0eXBlID0gY2FzdEV4cHJlc3Npb24uZ2V0VHlwZSgpOwotCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IHR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydFRydWUoIk5vdCBhbiBhcnJheSB0eXBlIiwgYmluZGluZy5pc0FycmF5KCkpOyAvLyROT04tTkxTLTEkCiAJfQogCiAJLyoqCkBAIC01OTkyLDE5ICs1ODI3LDYgQEAKIAkJRnVuY3Rpb25JbnZvY2F0aW9uIG1ldGhvZEludm9jYXRpb24gPSAoRnVuY3Rpb25JbnZvY2F0aW9uKSBleHByZXNzaW9uOwogCQlMaXN0IGFyZ3VtZW50cyA9IG1ldGhvZEludm9jYXRpb24uYXJndW1lbnRzKCk7CiAJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIGFyZ3VtZW50cy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjIgPSAoRXhwcmVzc2lvbikgYXJndW1lbnRzLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgQ2FzdEV4cHJlc3Npb24iLCBleHByZXNzaW9uMiBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IChDYXN0RXhwcmVzc2lvbikgZXhwcmVzc2lvbjI7Ci0JCVR5cGUgdHlwZSA9IGNhc3RFeHByZXNzaW9uLmdldFR5cGUoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgc2ltcGxlIHR5cGUiLCB0eXBlLmlzU2ltcGxlVHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlTaW1wbGVUeXBlIHNpbXBsZVR5cGUgPSAoU2ltcGxlVHlwZSkgdHlwZTsKLQkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB0eXBlLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCBiaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgYSBjbGFzcyIsIGJpbmRpbmcuaXNDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCQlOYW1lIG5hbWUgPSBzaW1wbGVUeXBlLmdldE5hbWUoKTsKLQkJSUJpbmRpbmcgYmluZGluZzIgPSBuYW1lLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmcyIiwgYmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgdHlwZSIsICJPYmplY3QiLCBiaW5kaW5nMi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAl9CiAKIAkvKioKQEAgLTYwMjMsMTMgKzU4NDUsNiBAQAogCQlGdW5jdGlvbkludm9jYXRpb24gbWV0aG9kSW52b2NhdGlvbiA9IChGdW5jdGlvbkludm9jYXRpb24pIGV4cHJlc3Npb247CiAJCUxpc3QgYXJndW1lbnRzID0gbWV0aG9kSW52b2NhdGlvbi5hcmd1bWVudHMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgYXJndW1lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IChFeHByZXNzaW9uKSBhcmd1bWVudHMuZ2V0KDApOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBDYXN0RXhwcmVzc2lvbiIsIGV4cHJlc3Npb24yIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUNhc3RFeHByZXNzaW9uIGNhc3RFeHByZXNzaW9uID0gKENhc3RFeHByZXNzaW9uKSBleHByZXNzaW9uMjsKLQkJVHlwZSB0eXBlID0gY2FzdEV4cHJlc3Npb24uZ2V0VHlwZSgpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBwcmltaXRpdmUgdHlwZSIsIHR5cGUuaXNQcmltaXRpdmVUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCVByaW1pdGl2ZVR5cGUgcHJpbWl0aXZlVHlwZSA9IChQcmltaXRpdmVUeXBlKSB0eXBlOwotCQlhc3NlcnRFcXVhbHMoIk5vdCBpbnQiLCBQcmltaXRpdmVUeXBlLklOVCwgcHJpbWl0aXZlVHlwZS5nZXRQcmltaXRpdmVUeXBlQ29kZSgpKTsgLy8kTk9OLU5MUy0xJAogCX0KIAogCS8qKgpAQCAtNjA0OCwxOSArNTg2Myw2IEBACiAJCUZ1bmN0aW9uSW52b2NhdGlvbiBtZXRob2RJbnZvY2F0aW9uID0gKEZ1bmN0aW9uSW52b2NhdGlvbikgZXhwcmVzc2lvbjsKIAkJTGlzdCBhcmd1bWVudHMgPSBtZXRob2RJbnZvY2F0aW9uLmFyZ3VtZW50cygpOwogCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBhcmd1bWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gKEV4cHJlc3Npb24pIGFyZ3VtZW50cy5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIENhc3RFeHByZXNzaW9uIiwgZXhwcmVzc2lvbjIgaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSAoQ2FzdEV4cHJlc3Npb24pIGV4cHJlc3Npb24yOwotCQlUeXBlIHR5cGUgPSBjYXN0RXhwcmVzc2lvbi5nZXRUeXBlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHNpbXBsZSB0eXBlIiwgdHlwZS5pc1NpbXBsZVR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJU2ltcGxlVHlwZSBzaW1wbGVUeXBlID0gKFNpbXBsZVR5cGUpIHR5cGU7Ci0JCUlUeXBlQmluZGluZyBiaW5kaW5nID0gdHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgY2xhc3MiLCBiaW5kaW5nLmlzQ2xhc3MoKSk7IC8vJE5PTi1OTFMtMSQKLQkJTmFtZSBuYW1lID0gc2ltcGxlVHlwZS5nZXROYW1lKCk7Ci0JCUlCaW5kaW5nIGJpbmRpbmcyID0gbmFtZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nMiIsIGJpbmRpbmcyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIHR5cGUiLCAiT2JqZWN0IiwgYmluZGluZzIuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJfQogCiAJLyoqCkBAIC03MTQ2LDE3ICs2OTQ4LDYgQEAKIAkJRXhwcmVzc2lvblN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50ID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIG5vZGU7CiAJCUV4cHJlc3Npb24gZXhwcmVzc2lvbjIgPSBleHByZXNzaW9uU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKIAkJYXNzZXJ0VHJ1ZSgiTm90IGFuIEFzc2lnbmVtZW50IiwgZXhwcmVzc2lvbjIgaW5zdGFuY2VvZiBBc3NpZ25tZW50KTsgLy8kTk9OLU5MUy0xJAotCQlBc3NpZ25tZW50IGFzc2lnbm1lbnQgPSAoQXNzaWdubWVudCkgZXhwcmVzc2lvbjI7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGFzc2lnbm1lbnQuZ2V0UmlnaHRIYW5kU2lkZSgpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBDYXN0RXhwcmVzc2lvbiIsIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSAoQ2FzdEV4cHJlc3Npb24pIGV4cHJlc3Npb247Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGNhc3RFeHByZXNzaW9uLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgdHlwZUJpbmRpbmcpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJjaGFyIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVR5cGUgdHlwZSA9IGNhc3RFeHByZXNzaW9uLmdldFR5cGUoKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IHR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZzIiLCB0eXBlQmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJjaGFyIiwgdHlwZUJpbmRpbmcyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0KIAogCS8qKgpAQCAtNzY5NCwxNyArNzQ4NSw2IEBACiAJCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwogCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7CiAJCWFzc2VydFRydWUoIk5vdCBhbiBBc3NpZ25lbWVudCIsIGV4cHJlc3Npb24yIGluc3RhbmNlb2YgQXNzaWdubWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gKEFzc2lnbm1lbnQpIGV4cHJlc3Npb24yOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBhc3NpZ25tZW50LmdldFJpZ2h0SGFuZFNpZGUoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgQ2FzdEV4cHJlc3Npb24iLCBleHByZXNzaW9uIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUNhc3RFeHByZXNzaW9uIGNhc3RFeHByZXNzaW9uID0gKENhc3RFeHByZXNzaW9uKSBleHByZXNzaW9uOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBjYXN0RXhwcmVzc2lvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiT2JqZWN0IiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVR5cGUgdHlwZSA9IGNhc3RFeHByZXNzaW9uLmdldFR5cGUoKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IHR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZzIiLCB0eXBlQmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJPYmplY3QiLCB0eXBlQmluZGluZzIuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJfQkJCQkJCiAKIAkvKioKQEAgLTc3MjEsMTcgKzc1MDEsNiBAQAogCQlFeHByZXNzaW9uU3RhdGVtZW50IGV4cHJlc3Npb25TdGF0ZW1lbnQgPSAoRXhwcmVzc2lvblN0YXRlbWVudCkgbm9kZTsKIAkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IGV4cHJlc3Npb25TdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwogCQlhc3NlcnRUcnVlKCJOb3QgYW4gQXNzaWduZW1lbnQiLCBleHByZXNzaW9uMiBpbnN0YW5jZW9mIEFzc2lnbm1lbnQpOyAvLyROT04tTkxTLTEkCi0JCUFzc2lnbm1lbnQgYXNzaWdubWVudCA9IChBc3NpZ25tZW50KSBleHByZXNzaW9uMjsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gYXNzaWdubWVudC5nZXRSaWdodEhhbmRTaWRlKCk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIENhc3RFeHByZXNzaW9uIiwgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIENhc3RFeHByZXNzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IChDYXN0RXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gY2FzdEV4cHJlc3Npb24ucmVzb2x2ZVR5cGVCaW5kaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCB0eXBlQmluZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgIk9iamVjdFtdIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVR5cGUgdHlwZSA9IGNhc3RFeHByZXNzaW9uLmdldFR5cGUoKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nMiA9IHR5cGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZzIiLCB0eXBlQmluZGluZzIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygiV3JvbmcgbmFtZSIsICJPYmplY3RbXSIsIHR5cGVCaW5kaW5nMi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAl9CQkJCQkKIAogCS8qKgpAQCAtNzc0OCwxNyArNzUxNyw2IEBACiAJCUV4cHJlc3Npb25TdGF0ZW1lbnQgZXhwcmVzc2lvblN0YXRlbWVudCA9IChFeHByZXNzaW9uU3RhdGVtZW50KSBub2RlOwogCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gZXhwcmVzc2lvblN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7CiAJCWFzc2VydFRydWUoIk5vdCBhbiBBc3NpZ25lbWVudCIsIGV4cHJlc3Npb24yIGluc3RhbmNlb2YgQXNzaWdubWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJQXNzaWdubWVudCBhc3NpZ25tZW50ID0gKEFzc2lnbm1lbnQpIGV4cHJlc3Npb24yOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBhc3NpZ25tZW50LmdldFJpZ2h0SGFuZFNpZGUoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgQ2FzdEV4cHJlc3Npb24iLCBleHByZXNzaW9uIGluc3RhbmNlb2YgQ2FzdEV4cHJlc3Npb24pOyAvLyROT04tTkxTLTEkCi0JCUNhc3RFeHByZXNzaW9uIGNhc3RFeHByZXNzaW9uID0gKENhc3RFeHByZXNzaW9uKSBleHByZXNzaW9uOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBjYXN0RXhwcmVzc2lvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiaW50W10iLCB0eXBlQmluZGluZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJVHlwZSB0eXBlID0gY2FzdEV4cHJlc3Npb24uZ2V0VHlwZSgpOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcyID0gdHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nMiIsIHR5cGVCaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgImludFtdIiwgdHlwZUJpbmRpbmcyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0JCQkJCQogCiAJLyoqCkBAIC03NzkzLDE3ICs3NTUxLDYgQEAKIAkJVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50ID0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG5vZGU7CiAJCUxpc3QgZnJhZ21lbnRzID0gdmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC5mcmFnbWVudHMoKTsKIAkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBzaXplIiwgMSwgZnJhZ21lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwotCQlhc3NlcnRUcnVlKCJOb3QgYSBDYXN0RXhwcmVzc2lvbiIsIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBDYXN0RXhwcmVzc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSAoQ2FzdEV4cHJlc3Npb24pIGV4cHJlc3Npb247Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGNhc3RFeHByZXNzaW9uLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyB0eXBlYmluZGluZyIsIHR5cGVCaW5kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoIldyb25nIG5hbWUiLCAiU3RyaW5nIiwgdHlwZUJpbmRpbmcuZ2V0TmFtZSgpKTsKLQkJVHlwZSB0eXBlID0gY2FzdEV4cHJlc3Npb24uZ2V0VHlwZSgpOwotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcyID0gdHlwZS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nMiIsIHR5cGVCaW5kaW5nMik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBuYW1lIiwgIlN0cmluZyIsIHR5cGVCaW5kaW5nMi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAl9CQkJCQkKIAogCS8qKgpAQCAtOTIzNiw4ICs4OTgzLDYgQEAKIAkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7CiAJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwogCQlhc3NlcnRUcnVlKCJOb3QgYSBjYXN0IGV4cHJlc3Npb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DQVNUX0VYUFJFU1NJT04pOyAvLyROT04tTkxTLTEkCi0JCVR5cGUgdHlwZSA9ICgoQ2FzdEV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmdldFR5cGUoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZSh0eXBlLCAiQSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKIAkvKioKQEAgLTk0NTMsOCArOTE5OCw2IEBACiAJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwogCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKIAkJYXNzZXJ0VHJ1ZSgiTm90IGEgY2FzdCBleHByZXNzaW9uIiwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ0FTVF9FWFBSRVNTSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlIHR5cGUgPSAoKENhc3RFeHByZXNzaW9uKSBleHByZXNzaW9uKS5nZXRUeXBlKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UodHlwZSwgIkEiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCiAJfQogCQogCS8qKgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQVNUQ29udmVydGVyQmluZGluZ3NUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9BU1RDb252ZXJ0ZXJCaW5kaW5nc1Rlc3QuamF2YQppbmRleCA4MmE0MjkwLi5lZmEzZThmIDEwMDY0NAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9BU1RDb252ZXJ0ZXJCaW5kaW5nc1Rlc3QuamF2YQorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9BU1RDb252ZXJ0ZXJCaW5kaW5nc1Rlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0zMCw3ICszMCw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQXJyYXlUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFzc2lnbm1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ2FzdEV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ2hhcmFjdGVyTGl0ZXJhbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5DbGFzc0luc3RhbmNlQ3JlYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ29uZGl0aW9uYWxFeHByZXNzaW9uOwpAQCAtNTMsNyArNTIsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLk51bGxMaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlBhcmFtZXRlcml6ZWRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlBvc3RmaXhFeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlByZWZpeEV4cHJlc3Npb247CkBAIC0xNTIsMTQgKzE1MCw2IEBACiAJCX0KIAogCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KENhc3RFeHByZXNzaW9uKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbm9kZS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JCX0KLQotCQkvKioKIAkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KENoYXJhY3RlckxpdGVyYWwpCiAJCSAqLwogCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKQEAgLTI4NywxNSArMjc3LDYgQEAKIAkJfQogCiAJCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoUGFyYW1ldGVyaXplZFR5cGUpCi0JCSAqIEBzaW5jZSAzLjAKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBhcmFtZXRlcml6ZWRUeXBlIG5vZGUpIHsKLQkJCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IG5vZGUucmVzb2x2ZUJpbmRpbmcoKTsKLQkJCWNvbGxlY3RCaW5kaW5ncyhub2RlLCB0eXBlQmluZGluZyk7Ci0JCX0KLQotCQkvKioKIAkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKQogCQkgKi8KIAkJcHVibGljIHZvaWQgZW5kVmlzaXQoUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQVNUQ29udmVydGVySmF2YWRvY1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0FTVENvbnZlcnRlckphdmFkb2NUZXN0LmphdmEKaW5kZXggYjA4ZDliNi4uMmExYTcxYyAxMDA2NDQKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQVNUQ29udmVydGVySmF2YWRvY1Rlc3QuamF2YQorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9BU1RDb252ZXJ0ZXJKYXZhZG9jVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTI0NTMsNyArMjQ1Myw2IEBACiAJCQlhc3NlcnRUcnVlKCJXcm9uZyBraW5kIG9mIGJpbmRpbmciLCBiaW5kaW5nIGluc3RhbmNlb2YgSVR5cGVCaW5kaW5nKTsKIAkJCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IChJVHlwZUJpbmRpbmcpYmluZGluZzsKIAkJCWFzc2VydFRydWUoc2VlUmVmLnRvU3RyaW5nKCkrIiBzaG91bGQgaGF2ZSBhIGdlbmVyaWMgdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcuaXNHZW5lcmljVHlwZSgpKTsKLQkJCWFzc2VydEZhbHNlKHNlZVJlZi50b1N0cmluZygpKyIgc2hvdWxkIE5PVCBoYXZlIGEgcGFyYW1ldGVyaXplZCB0eXBlIGJpbmRpbmciLCB0eXBlQmluZGluZy5pc1BhcmFtZXRlcml6ZWRUeXBlKCkpOwogCQkJYXNzZXJ0RmFsc2Uoc2VlUmVmLnRvU3RyaW5nKCkrIiBzaG91bGQgTk9UIGhhdmUgYSByYXcgdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcuaXNSYXdUeXBlKCkpOwogCQkJLy8gR2V0IGlubGluZSB0YWcgc2ltcGxlIG5hbWUgcmVmZXJlbmNlIGluIHNlY29uZCB0YWcKIAkJCWFzc2VydEVxdWFscygiSW52YWxpZCBudW1iZXIgb2YgZnJhZ21lbnRzIGZvciBpbmxpbmUgdGFnIGVsZW1lbnQ6ICIraW5saW5lVGFnLCAxLCBpbmxpbmVUYWcuZnJhZ21lbnRzKCkuc2l6ZSgpKTsKQEAgLTI0NjUsNyArMjQ2NCw2IEBACiAJCQlhc3NlcnRUcnVlKCJXcm9uZyBraW5kIG9mIGJpbmRpbmciLCBiaW5kaW5nIGluc3RhbmNlb2YgSVR5cGVCaW5kaW5nKTsKIAkJCXR5cGVCaW5kaW5nID0gKElUeXBlQmluZGluZyliaW5kaW5nOwogCQkJYXNzZXJ0VHJ1ZShsaW5rUmVmLnRvU3RyaW5nKCkrIiBzaG91bGQgaGF2ZSBhIGdlbmVyaWMgdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcuaXNHZW5lcmljVHlwZSgpKTsKLQkJCWFzc2VydEZhbHNlKGxpbmtSZWYudG9TdHJpbmcoKSsiIHNob3VsZCBOT1QgaGF2ZSBhIHBhcmFtZXRlcml6ZWQgdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKTsKIAkJCWFzc2VydEZhbHNlKGxpbmtSZWYudG9TdHJpbmcoKSsiIHNob3VsZCBOT1QgaGF2ZSBhIHJhdyB0eXBlIGJpbmRpbmciLCB0eXBlQmluZGluZy5pc1Jhd1R5cGUoKSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9BU1RDb252ZXJ0ZXJSZWNvdmVyeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0FTVENvbnZlcnRlclJlY292ZXJ5VGVzdC5qYXZhCmluZGV4IDc1MTE0YWIuLjY1NzllMmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0FTVENvbnZlcnRlclJlY292ZXJ5VGVzdC5qYXZhCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0FTVENvbnZlcnRlclJlY292ZXJ5VGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE5LDI0ICsxOSwyMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFTVDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5BU1ROb2RlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQXNzZXJ0U3RhdGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFzc2lnbm1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uSmF2YVNjcmlwdFVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uRW1wdHlTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5FeHByZXNzaW9uU3RhdGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkZvclN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uRnVuY3Rpb25EZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5GdW5jdGlvbkludm9jYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkphdmFTY3JpcHRVbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uU2ltcGxlTmFtZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5TdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbjsKIAogcHVibGljIGNsYXNzIEFTVENvbnZlcnRlclJlY292ZXJ5VGVzdCBleHRlbmRzIENvbnZlcnRlclRlc3RTZXR1cCB7CiAJcHVibGljIEFTVENvbnZlcnRlclJlY292ZXJ5VGVzdChTdHJpbmcgbmFtZSkgewpAQCAtODU0LDEzICs4NTMsNiBAQAogCQlhc3NlcnRFcXVhbHMoIndyb25nIHNpemUiLCAxLCBzdGF0ZW1lbnRzLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKIAkJU3RhdGVtZW50IHN0YXRlbWVudCA9IChTdGF0ZW1lbnQpIHN0YXRlbWVudHMuZ2V0KDApOwogCQlhc3NlcnRUcnVlKCJOb3QgYW4gYXNzZXJ0IHN0YXRlbWVudCIsIHN0YXRlbWVudC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVNTRVJUX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJQXNzZXJ0U3RhdGVtZW50IGFzc2VydFN0YXRlbWVudCA9IChBc3NlcnRTdGF0ZW1lbnQpIHN0YXRlbWVudDsKLQkJY2hlY2tTb3VyY2VSYW5nZShhc3NlcnRTdGF0ZW1lbnQsICJhc3NlcnQgMCA9PSAwIDogYVswOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiRmxhZyBhcyBSRUNPVkVSRUQiLCAoYXNzZXJ0U3RhdGVtZW50LmdldEZsYWdzKCkgJiBBU1ROb2RlLlJFQ09WRVJFRCkgPT0gMCk7Ci0JCUV4cHJlc3Npb24gbWVzc2FnZSA9IGFzc2VydFN0YXRlbWVudC5nZXRNZXNzYWdlKCk7Ci0JCWFzc2VydFRydWUoIk5vIG1lc3NhZ2UgZXhwcmVzc2lvbiIsIG1lc3NhZ2UgIT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShtZXNzYWdlLCAiYVswIiwgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRUcnVlKCJOb3QgZmxhZyBhcyBSRUNPVkVSRUQiLCAobWVzc2FnZS5nZXRGbGFncygpICYgQVNUTm9kZS5SRUNPVkVSRUQpICE9IDApOwogCX0KIAkKIAkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzMjEyCkBAIC04OTksMTMgKzg5MSw2IEBACiAJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIHN0YXRlbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAogCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFN0YXRlbWVudCkgc3RhdGVtZW50cy5nZXQoMCk7CiAJCWFzc2VydFRydWUoIk5vdCBhbiBhc3NlcnQgc3RhdGVtZW50Iiwgc3RhdGVtZW50LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BU1NFUlRfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlBc3NlcnRTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50ID0gKEFzc2VydFN0YXRlbWVudCkgc3RhdGVtZW50OwotCQljaGVja1NvdXJjZVJhbmdlKGFzc2VydFN0YXRlbWVudCwgImFzc2VydCAwID09IDAgOiBmb28oOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiRmxhZyBhcyBSRUNPVkVSRUQiLCAoYXNzZXJ0U3RhdGVtZW50LmdldEZsYWdzKCkgJiBBU1ROb2RlLlJFQ09WRVJFRCkgPT0gMCk7Ci0JCUV4cHJlc3Npb24gbWVzc2FnZSA9IGFzc2VydFN0YXRlbWVudC5nZXRNZXNzYWdlKCk7Ci0JCWFzc2VydFRydWUoIk5vIG1lc3NhZ2UgZXhwcmVzc2lvbiIsIG1lc3NhZ2UgIT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShtZXNzYWdlLCAiZm9vKCIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGZsYWcgYXMgUkVDT1ZFUkVEIiwgKG1lc3NhZ2UuZ2V0RmxhZ3MoKSAmIEFTVE5vZGUuUkVDT1ZFUkVEKSAhPSAwKTsKIAl9CiAJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MzIxMgogCXB1YmxpYyB2b2lkIHRlc3QwMDE3KCkgdGhyb3dzIEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiB7CkBAIC05NDMsMTIgKzkyOCw1IEBACiAJCWFzc2VydEVxdWFscygid3Jvbmcgc2l6ZSIsIDEsIHN0YXRlbWVudHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAogCQlTdGF0ZW1lbnQgc3RhdGVtZW50ID0gKFN0YXRlbWVudCkgc3RhdGVtZW50cy5nZXQoMCk7CiAJCWFzc2VydFRydWUoIk5vdCBhbiBhc3NlcnQgc3RhdGVtZW50Iiwgc3RhdGVtZW50LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BU1NFUlRfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQlBc3NlcnRTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50ID0gKEFzc2VydFN0YXRlbWVudCkgc3RhdGVtZW50OwotCQljaGVja1NvdXJjZVJhbmdlKGFzc2VydFN0YXRlbWVudCwgImFzc2VydCAwID09IDAgOiAoXCJhYVwiOyIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiRmxhZyBhcyBSRUNPVkVSRUQiLCAoYXNzZXJ0U3RhdGVtZW50LmdldEZsYWdzKCkgJiBBU1ROb2RlLlJFQ09WRVJFRCkgPT0gMCk7Ci0JCUV4cHJlc3Npb24gbWVzc2FnZSA9IGFzc2VydFN0YXRlbWVudC5nZXRNZXNzYWdlKCk7Ci0JCWFzc2VydFRydWUoIk5vIG1lc3NhZ2UgZXhwcmVzc2lvbiIsIG1lc3NhZ2UgIT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJY2hlY2tTb3VyY2VSYW5nZShtZXNzYWdlLCAiKFwiYWFcIiIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0VHJ1ZSgiTm90IGZsYWcgYXMgUkVDT1ZFUkVEIiwgKG1lc3NhZ2UuZ2V0RmxhZ3MoKSAmIEFTVE5vZGUuUkVDT1ZFUkVEKSAhPSAwKTsKIAl9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9BU1RDb252ZXJ0ZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9BU1RDb252ZXJ0ZXJUZXN0LmphdmEKaW5kZXggOWU3YThmZi4uMzM3ZTlhZCAxMDA2NDQKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQVNUQ29udmVydGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0FTVENvbnZlcnRlclRlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xNiw4ICsxNiw4IEBACiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5JSmF2YVNjcmlwdFVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5KYXZhU2NyaXB0Q29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLkphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5BU1Q7CkBAIC0zMSwxMSArMzEsOSBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkJsb2NrOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkJvb2xlYW5MaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkJyZWFrU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkNhc3RFeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkNhdGNoQ2xhdXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkNoYXJhY3RlckxpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ2xhc3NJbnN0YW5jZUNyZWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkphdmFTY3JpcHRVbml0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkNvbmRpdGlvbmFsRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Db250aW51ZVN0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Eb1N0YXRlbWVudDsKQEAgLTQ0LDYgKzQyLDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5FeHByZXNzaW9uU3RhdGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkZpZWxkQWNjZXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkZvclN0YXRlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5GdW5jdGlvbkRlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkZ1bmN0aW9uSW52b2NhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5JQmluZGluZzsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5JRnVuY3Rpb25CaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKQEAgLTUyLDkgKzUyLDggQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5JbXBvcnREZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5JbmZpeEV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uSlNkb2M7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uSmF2YVNjcmlwdFVuaXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uTGFiZWxlZFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5GdW5jdGlvbkRlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkZ1bmN0aW9uSW52b2NhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Nb2RpZmllcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5OYW1lOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLk51bGxMaXRlcmFsOwpAQCAtOTQyMyw4ICs5NDIyLDYgQEAKIAkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCA9IChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIGZyYWdtZW50cy5nZXQoMCk7CiAJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwogCQlhc3NlcnRUcnVlKCJOb3QgYSBjYXN0IGV4cHJlc3Npb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DQVNUX0VYUFJFU1NJT04pOyAvLyROT04tTkxTLTEkCi0JCVR5cGUgdHlwZSA9ICgoQ2FzdEV4cHJlc3Npb24pIGV4cHJlc3Npb24pLmdldFR5cGUoKTsKLQkJY2hlY2tTb3VyY2VSYW5nZSh0eXBlLCAiQSIsIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKIAkvKioKQEAgLTk2NDEsOCArOTYzOCw2IEBACiAJCVZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgPSAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KSBmcmFnbWVudHMuZ2V0KDApOwogCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQuZ2V0SW5pdGlhbGl6ZXIoKTsKIAkJYXNzZXJ0VHJ1ZSgiTm90IGEgY2FzdCBleHByZXNzaW9uIiwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQ0FTVF9FWFBSRVNTSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlUeXBlIHR5cGUgPSAoKENhc3RFeHByZXNzaW9uKSBleHByZXNzaW9uKS5nZXRUeXBlKCk7Ci0JCWNoZWNrU291cmNlUmFuZ2UodHlwZSwgIkEiLCBzb3VyY2UpOyAvLyROT04tTkxTLTEkCiAJfQogCQogCS8qKgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQVNUQ29udmVydGVyVGVzdDIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0FTVENvbnZlcnRlclRlc3QyLmphdmEKaW5kZXggYWUxNDIxZC4uMDhhYTNiNyAxMDA2NDQKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQVNUQ29udmVydGVyVGVzdDIuamF2YQorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9BU1RDb252ZXJ0ZXJUZXN0Mi5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTE0ODAsMTEgKzE0ODAsNiBAQAogCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBmcmFnbWVudC5nZXRJbml0aWFsaXplcigpOwogCQlhc3NlcnRUcnVlKCJub3QgYSBjYXN0IGV4cHJlc3Npb24iLCBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5DQVNUX0VYUFJFU1NJT04pOyAvLyROT04tTkxTLTEkCiAJCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbiwgIihpbnQpICgzLjE0ZiAqIGEpIiwgc291cmNlKTsKLQkJQ2FzdEV4cHJlc3Npb24gY2FzdEV4cHJlc3Npb24gPSAoQ2FzdEV4cHJlc3Npb24pIGV4cHJlc3Npb247Ci0JCWNoZWNrU291cmNlUmFuZ2UoY2FzdEV4cHJlc3Npb24uZ2V0VHlwZSgpLCAiaW50Iiwgc291cmNlKTsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uMiA9IGNhc3RFeHByZXNzaW9uLmdldEV4cHJlc3Npb24oKTsKLQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uMiwgIigzLjE0ZiAqIGEpIiwgc291cmNlKTsJCi0JCWFzc2VydFRydWUoIm5vdCBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiIsIGV4cHJlc3Npb24yLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5QQVJFTlRIRVNJWkVEX0VYUFJFU1NJT04pOyAvLyROT04tTkxTLTEkCiAJfQogCS8qKgogCSAqIGh0dHA6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4NjgyCkBAIC0xNzc2LDkgKzE3NzEsNiBAQAogCQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwogCQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiYXNzZXJ0IHJlZiAhPSBudWxsIDogbWVzc2FnZTsiLCBzb3VyY2UpOwogCQkJYXNzZXJ0VHJ1ZSgibm90IGFuIGFzc2VydCBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BU1NFUlRfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJQXNzZXJ0U3RhdGVtZW50IHN0YXRlbWVudCA9IChBc3NlcnRTdGF0ZW1lbnQpIG5vZGU7Ci0JCQljaGVja1NvdXJjZVJhbmdlKHN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCksICJyZWYgIT0gbnVsbCIsIHNvdXJjZSk7Ci0JCQljaGVja1NvdXJjZVJhbmdlKHN0YXRlbWVudC5nZXRNZXNzYWdlKCksICJtZXNzYWdlIiwgc291cmNlKTsKIAkJfSBmaW5hbGx5IHsKIAkJCUphdmFTY3JpcHRDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7CiAJCX0KQEAgLTE4MDAsMTUgKzE3OTIsMTAgQEAKIAkJCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKIAkJCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImFzc2VydCByZWYgIT0gbnVsbCA6IG1lc3NhZ2VcXHUwMDNCIiwgc291cmNlKTsKIAkJCWFzc2VydFRydWUoIm5vdCBhbiBhc3NlcnQgc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVNTRVJUX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCUFzc2VydFN0YXRlbWVudCBzdGF0ZW1lbnQgPSAoQXNzZXJ0U3RhdGVtZW50KSBub2RlOwotCQkJY2hlY2tTb3VyY2VSYW5nZShzdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpLCAicmVmICE9IG51bGwiLCBzb3VyY2UpOwotCQkJY2hlY2tTb3VyY2VSYW5nZShzdGF0ZW1lbnQuZ2V0TWVzc2FnZSgpLCAibWVzc2FnZSIsIHNvdXJjZSk7CiAJCQkKIAkJCW5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMSk7CiAJCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJhc3NlcnQgcmVmICE9IG51bGxcXHUwMDNCIiwgc291cmNlKTsKIAkJCWFzc2VydFRydWUoIm5vdCBhbiBhc3NlcnQgc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVNTRVJUX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCXN0YXRlbWVudCA9IChBc3NlcnRTdGF0ZW1lbnQpIG5vZGU7Ci0JCQljaGVja1NvdXJjZVJhbmdlKHN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCksICJyZWYgIT0gbnVsbCIsIHNvdXJjZSk7CiAJCX0gZmluYWxseSB7CiAJCQlKYXZhU2NyaXB0Q29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwogCQl9CkBAIC0xOTUyLDEwICsxOTM5LDYgQEAKIAkJCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAwKTsKIAkJCWFzc2VydE5vdE51bGwoIk5vIG5vZGUiLCBub2RlKTsKIAkJCWFzc2VydFRydWUoIm5vdCBhbiBhc3NlcnQgc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVNTRVJUX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCUFzc2VydFN0YXRlbWVudCBhc3NlcnRTdGF0ZW1lbnQgPSAoQXNzZXJ0U3RhdGVtZW50KSBub2RlOwotCQkJY2hlY2tTb3VyY2VSYW5nZShhc3NlcnRTdGF0ZW1lbnQsICJhc3NlcnQodHJ1ZSk7Iiwgc291cmNlKTsKLQkJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGFzc2VydFN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICIodHJ1ZSkiLCBzb3VyY2UpOwogCQl9IGZpbmFsbHkgewogCQkJSmF2YVNjcmlwdENvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKIAkJfQpAQCAtMjU3NCwxMCArMjU1Nyw2IEBACiAJCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBwcm9ibGVtcyIsIDAsIHVuaXQuZ2V0UHJvYmxlbXMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkPAogCQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZSh1bml0LCAwLCAwLCAwKTsKIAkJCWFzc2VydFRydWUoIm5vdCBhbiBhc3NlcnQgc3RhdGVtZW50Iiwgbm9kZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVNTRVJUX1NUQVRFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCUFzc2VydFN0YXRlbWVudCBhc3NlcnRTdGF0ZW1lbnQgPSAoQXNzZXJ0U3RhdGVtZW50KSBub2RlOwotCQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gYXNzZXJ0U3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJCWFzc2VydFRydWUoIm5vdCBhIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiIsIGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlBBUkVOVEhFU0laRURfRVhQUkVTU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbiwgIihsb2dpbk5hbWUgIT0gbnVsbCkiLCBzb3VyY2UpOwogCQl9IGZpbmFsbHkgewogCQkJSmF2YVNjcmlwdENvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKIAkJfQpAQCAtMjYwMCw5ICsyNTc5LDYgQEAKIAkJCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMCwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8CiAJCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKHVuaXQsIDAsIDAsIDApOwogCQkJYXNzZXJ0VHJ1ZSgibm90IGFuIGFzc2VydCBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BU1NFUlRfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJQXNzZXJ0U3RhdGVtZW50IGFzc2VydFN0YXRlbWVudCA9IChBc3NlcnRTdGF0ZW1lbnQpIG5vZGU7Ci0JCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBhc3NlcnRTdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAibG9naW5OYW1lICE9IG51bGwiLCBzb3VyY2UpOwogCQl9IGZpbmFsbHkgewogCQkJSmF2YVNjcmlwdENvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKIAkJfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQVNUQ29udmVydGVyVGVzdEFTVDNfMi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQVNUQ29udmVydGVyVGVzdEFTVDNfMi5qYXZhCmluZGV4IDk5ZWRhOWEuLjFkNDAwN2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0FTVENvbnZlcnRlclRlc3RBU1QzXzIuamF2YQorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9BU1RDb252ZXJ0ZXJUZXN0QVNUM18yLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjIsMTEgKzIyLDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSUNsYXNzRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0VW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklGdW5jdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklJbml0aWFsaXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0RWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0UHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklGdW5jdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklKYXZhU2NyaXB0VW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklTb3VyY2VSYW5nZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLklUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuSmF2YVNjcmlwdENvcmU7CkBAIC00MywyMSArNDMsMjAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Bbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQXJyYXlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFzc2VydFN0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Bc3NpZ25tZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkJsb2NrOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5DYXN0RXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5DYXRjaENsYXVzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5DaGFyYWN0ZXJMaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkNsYXNzSW5zdGFuY2VDcmVhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5KYXZhU2NyaXB0VW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Db25zdHJ1Y3Rvckludm9jYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5FeHByZXNzaW9uU3RhdGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkZpZWxkQWNjZXNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uRm9yU3RhdGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkZ1bmN0aW9uRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uRnVuY3Rpb25JbnZvY2F0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLklCaW5kaW5nOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLklGdW5jdGlvbkJpbmRpbmc7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwpAQCAtNjcsOCArNjYsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkluZml4RXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Jbml0aWFsaXplcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5JbnN0YW5jZW9mRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5GdW5jdGlvbkRlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkZ1bmN0aW9uSW52b2NhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5KYXZhU2NyaXB0VW5pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Nb2RpZmllcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5OYW1lOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLk51bGxMaXRlcmFsOwpAQCAtMTU1MCwxMSArMTU0OCw2IEBACiAJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGZyYWdtZW50LmdldEluaXRpYWxpemVyKCk7CiAJCWFzc2VydFRydWUoIm5vdCBhIGNhc3QgZXhwcmVzc2lvbiIsIGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNBU1RfRVhQUkVTU0lPTik7IC8vJE5PTi1OTFMtMSQKIAkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAiKGludCkgKDMuMTRmICogYSkiLCBzb3VyY2UpOwotCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IChDYXN0RXhwcmVzc2lvbikgZXhwcmVzc2lvbjsKLQkJY2hlY2tTb3VyY2VSYW5nZShjYXN0RXhwcmVzc2lvbi5nZXRUeXBlKCksICJpbnQiLCBzb3VyY2UpOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24yID0gY2FzdEV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbigpOwotCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24yLCAiKDMuMTRmICogYSkiLCBzb3VyY2UpOwkKLQkJYXNzZXJ0VHJ1ZSgibm90IGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIiwgZXhwcmVzc2lvbjIuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlBBUkVOVEhFU0laRURfRVhQUkVTU0lPTik7IC8vJE5PTi1OTFMtMSQKIAl9CiAJLyoqCiAJICogaHR0cDovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Mjg2ODIKQEAgLTE4NDYsOSArMTgzOSw2IEBACiAJCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKGNvbXBpbGF0aW9uVW5pdCwgMCwgMCwgMCk7CiAJCQljaGVja1NvdXJjZVJhbmdlKG5vZGUsICJhc3NlcnQgcmVmICE9IG51bGwgOiBtZXNzYWdlOyIsIHNvdXJjZSk7CiAJCQlhc3NlcnRUcnVlKCJub3QgYW4gYXNzZXJ0IHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFTU0VSVF9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCQlBc3NlcnRTdGF0ZW1lbnQgc3RhdGVtZW50ID0gKEFzc2VydFN0YXRlbWVudCkgbm9kZTsKLQkJCWNoZWNrU291cmNlUmFuZ2Uoc3RhdGVtZW50LmdldEV4cHJlc3Npb24oKSwgInJlZiAhPSBudWxsIiwgc291cmNlKTsKLQkJCWNoZWNrU291cmNlUmFuZ2Uoc3RhdGVtZW50LmdldE1lc3NhZ2UoKSwgIm1lc3NhZ2UiLCBzb3VyY2UpOwogCQl9IGZpbmFsbHkgewogCQkJSmF2YVNjcmlwdENvcmUuc2V0T3B0aW9ucyhvcHRpb25zKTsKIAkJfQpAQCAtMTg3MCwxNSArMTg2MCwxMCBAQAogCQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwogCQkJY2hlY2tTb3VyY2VSYW5nZShub2RlLCAiYXNzZXJ0IHJlZiAhPSBudWxsIDogbWVzc2FnZVxcdTAwM0IiLCBzb3VyY2UpOwogCQkJYXNzZXJ0VHJ1ZSgibm90IGFuIGFzc2VydCBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BU1NFUlRfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJQXNzZXJ0U3RhdGVtZW50IHN0YXRlbWVudCA9IChBc3NlcnRTdGF0ZW1lbnQpIG5vZGU7Ci0JCQljaGVja1NvdXJjZVJhbmdlKHN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCksICJyZWYgIT0gbnVsbCIsIHNvdXJjZSk7Ci0JCQljaGVja1NvdXJjZVJhbmdlKHN0YXRlbWVudC5nZXRNZXNzYWdlKCksICJtZXNzYWdlIiwgc291cmNlKTsKIAkJCQogCQkJbm9kZSA9IGdldEFTVE5vZGUoY29tcGlsYXRpb25Vbml0LCAwLCAwLCAxKTsKIAkJCWNoZWNrU291cmNlUmFuZ2Uobm9kZSwgImFzc2VydCByZWYgIT0gbnVsbFxcdTAwM0IiLCBzb3VyY2UpOwogCQkJYXNzZXJ0VHJ1ZSgibm90IGFuIGFzc2VydCBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BU1NFUlRfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RhdGVtZW50ID0gKEFzc2VydFN0YXRlbWVudCkgbm9kZTsKLQkJCWNoZWNrU291cmNlUmFuZ2Uoc3RhdGVtZW50LmdldEV4cHJlc3Npb24oKSwgInJlZiAhPSBudWxsIiwgc291cmNlKTsKIAkJfSBmaW5hbGx5IHsKIAkJCUphdmFTY3JpcHRDb3JlLnNldE9wdGlvbnMob3B0aW9ucyk7CiAJCX0KQEAgLTIwMjIsMTAgKzIwMDcsNiBAQAogCQkJQVNUTm9kZSBub2RlID0gZ2V0QVNUTm9kZShjb21waWxhdGlvblVuaXQsIDAsIDAsIDApOwogCQkJYXNzZXJ0Tm90TnVsbCgiTm8gbm9kZSIsIG5vZGUpOwogCQkJYXNzZXJ0VHJ1ZSgibm90IGFuIGFzc2VydCBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BU1NFUlRfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJQXNzZXJ0U3RhdGVtZW50IGFzc2VydFN0YXRlbWVudCA9IChBc3NlcnRTdGF0ZW1lbnQpIG5vZGU7Ci0JCQljaGVja1NvdXJjZVJhbmdlKGFzc2VydFN0YXRlbWVudCwgImFzc2VydCh0cnVlKTsiLCBzb3VyY2UpOwotCQkJRXhwcmVzc2lvbiBleHByZXNzaW9uID0gYXNzZXJ0U3RhdGVtZW50LmdldEV4cHJlc3Npb24oKTsKLQkJCWNoZWNrU291cmNlUmFuZ2UoZXhwcmVzc2lvbiwgIih0cnVlKSIsIHNvdXJjZSk7CiAJCX0gZmluYWxseSB7CiAJCQlKYXZhU2NyaXB0Q29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwogCQl9CkBAIC0yNjQ0LDEwICsyNjI1LDYgQEAKIAkJCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHByb2JsZW1zIiwgMCwgdW5pdC5nZXRQcm9ibGVtcygpLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQ8CiAJCQlBU1ROb2RlIG5vZGUgPSBnZXRBU1ROb2RlKHVuaXQsIDAsIDAsIDApOwogCQkJYXNzZXJ0VHJ1ZSgibm90IGFuIGFzc2VydCBzdGF0ZW1lbnQiLCBub2RlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BU1NFUlRfU1RBVEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJQXNzZXJ0U3RhdGVtZW50IGFzc2VydFN0YXRlbWVudCA9IChBc3NlcnRTdGF0ZW1lbnQpIG5vZGU7Ci0JCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBhc3NlcnRTdGF0ZW1lbnQuZ2V0RXhwcmVzc2lvbigpOwotCQkJYXNzZXJ0VHJ1ZSgibm90IGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIiwgZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuUEFSRU5USEVTSVpFRF9FWFBSRVNTSU9OKTsgLy8kTk9OLU5MUy0xJAotCQkJY2hlY2tTb3VyY2VSYW5nZShleHByZXNzaW9uLCAiKGxvZ2luTmFtZSAhPSBudWxsKSIsIHNvdXJjZSk7CiAJCX0gZmluYWxseSB7CiAJCQlKYXZhU2NyaXB0Q29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwogCQl9CkBAIC0yNjcwLDkgKzI2NDcsNiBAQAogCQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgcHJvYmxlbXMiLCAwLCB1bml0LmdldFByb2JsZW1zKCkubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJDwKIAkJCUFTVE5vZGUgbm9kZSA9IGdldEFTVE5vZGUodW5pdCwgMCwgMCwgMCk7CiAJCQlhc3NlcnRUcnVlKCJub3QgYW4gYXNzZXJ0IHN0YXRlbWVudCIsIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFTU0VSVF9TVEFURU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCQlBc3NlcnRTdGF0ZW1lbnQgYXNzZXJ0U3RhdGVtZW50ID0gKEFzc2VydFN0YXRlbWVudCkgbm9kZTsKLQkJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGFzc2VydFN0YXRlbWVudC5nZXRFeHByZXNzaW9uKCk7Ci0JCQljaGVja1NvdXJjZVJhbmdlKGV4cHJlc3Npb24sICJsb2dpbk5hbWUgIT0gbnVsbCIsIHNvdXJjZSk7CiAJCX0gZmluYWxseSB7CiAJCQlKYXZhU2NyaXB0Q29yZS5zZXRPcHRpb25zKG9wdGlvbnMpOwogCQl9CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9BU1RNYXRjaGVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQVNUTWF0Y2hlclRlc3QuamF2YQppbmRleCAyNDVlNGFkLi4wNWJkMzNlIDEwMDY0NAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9BU1RNYXRjaGVyVGVzdC5qYXZhCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0FTVE1hdGNoZXJUZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjQsMTMgKzI0LDExIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQXJyYXlDcmVhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFycmF5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Bc3NlcnRTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQXNzaWdubWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5CbG9jazsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5CbG9ja0NvbW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQnJlYWtTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ2FzdEV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ2F0Y2hDbGF1c2U7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ2hhcmFjdGVyTGl0ZXJhbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5DbGFzc0luc3RhbmNlQ3JlYXRpb247CkBAIC02Myw3ICs2MSw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uTnVsbExpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uTnVtYmVyTGl0ZXJhbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5QYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uUGFyYW1ldGVyaXplZFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uUGFyZW50aGVzaXplZEV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uUG9zdGZpeEV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uUHJlZml4RXhwcmVzc2lvbjsKQEAgLTkwLDEyICs4NywxMCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uVHlwZUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uVHlwZVBhcmFtZXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5XaGlsZVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5XaWxkY2FyZFR5cGU7CiAKIC8qKgogICogVGVzdCBzdWl0ZSBmb3IgPGNvZGU+QVNUTWF0Y2hlcjwvY29kZT4gYW5kIDxjb2RlPkFTVE5vZGUuc3VidHJlZU1hdGNoPC9jb2RlPi4KQEAgLTEyOSw3ICsxMjQsNiBAQAogCVN0cmluZyBUMVM7CiAJVHlwZSBUMjsKIAlTdHJpbmcgVDJTOwotCVBhcmFtZXRlcml6ZWRUeXBlIFBUMTsKIAlTdHJpbmcgUFQxUzsKIAlTdGF0ZW1lbnQgUzE7CiAJU3RhdGVtZW50IFMyOwpAQCAtMTQ5LDkgKzE0Myw3IEBACiAJSlNkb2MgSkQxOwogCUpTZG9jIEpEMjsKIAlTdHJpbmcgSkQyUzsKLQlUeXBlUGFyYW1ldGVyIFRQMTsKIAlTdHJpbmcgVFAxUzsKLQlUeXBlUGFyYW1ldGVyIFRQMjsKIAlTdHJpbmcgVFAyUzsKIAlUYWdFbGVtZW50IFRBRzE7CiAJVGFnRWxlbWVudCBUQUcyOwpAQCAtMjU4LDE1ICsyNTAsMTAgQEAKIAkJTVBBUk0xLnNldFR5cGUoYXN0Lm5ld1ByaW1pdGl2ZVR5cGUoUHJpbWl0aXZlVHlwZS5DSEFSKSk7CiAKIAkJaWYgKGFzdC5hcGlMZXZlbCgpID49IEFTVC5KTFMzKSB7Ci0JCQlQVDEgPSBhc3QubmV3UGFyYW1ldGVyaXplZFR5cGUoYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld1NpbXBsZU5hbWUoIloiKSkpOyAvLyROT04tTkxTLTEkCiAJCQlQVDFTID0gIlsodE1bKHRTWyhuU1pablMpXXRTKV10TSldIjsgLy8kTk9OLU5MUy0xJAogCi0JCQlUUDEgPSBhc3QubmV3VHlwZVBhcmFtZXRlcigpOwotCQkJVFAxLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoIngiKSk7IC8vJE5PTi1OTFMtMSQKIAkJCVRQMVMgPSAiWyh0VFBbKG5TeHhuUylddFRQKV0iOyAvLyROT04tTkxTLTEkCi0JCi0JCQlUUDIgPSBhc3QubmV3VHlwZVBhcmFtZXRlcigpOwotCQkJVFAyLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoInkiKSk7IC8vJE5PTi1OTFMtMSQKKwogCQkJVFAyUyA9ICJbKHRUUFsoblN5eW5TKV10VFApXSI7IC8vJE5PTi1OTFMtMSQKIAkJCUxDMSA9IGFzdC5uZXdMaW5lQ29tbWVudCgpOwogCkBAIC0zNDUsOSArMzMyLDYgQEAKIAkJcHVibGljIGJvb2xlYW4gbWF0Y2goQXJyYXlUeXBlIG5vZGUsIE9iamVjdCBvdGhlcikgewogCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKIAkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChBc3NlcnRTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7Ci0JCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwotCQl9CiAJCXB1YmxpYyBib29sZWFuIG1hdGNoKEFzc2lnbm1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7CiAJCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwogCQl9CkBAIC0zNjMsOSArMzQ3LDYgQEAKIAkJcHVibGljIGJvb2xlYW4gbWF0Y2goQnJlYWtTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7CiAJCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwogCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKENhc3RFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQogCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChDYXRjaENsYXVzZSBub2RlLCBPYmplY3Qgb3RoZXIpIHsKIAkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7CiAJCX0KQEAgLTQ1Niw5ICs0MzcsNiBAQAogCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChQYWNrYWdlRGVjbGFyYXRpb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7CiAJCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwogCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFBhcmFtZXRlcml6ZWRUeXBlIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJcmV0dXJuIHN0YW5kYXJkQm9keShub2RlLCBvdGhlciwgc3VwZXJNYXRjaCA/IHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKSA6IGZhbHNlKTsKLQkJfQogCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKIAkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7CiAJCX0KQEAgLTUzMiw5ICs1MTAsNiBAQAogCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChUeXBlTGl0ZXJhbCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKIAkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7CiAJCX0KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goVHlwZVBhcmFtZXRlciBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KIAkJcHVibGljIGJvb2xlYW4gbWF0Y2goVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7CiAJCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwogCQl9CkBAIC01NDcsOSArNTIyLDYgQEAKIAkJcHVibGljIGJvb2xlYW4gbWF0Y2goV2hpbGVTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IG90aGVyKSB7CiAJCQlyZXR1cm4gc3RhbmRhcmRCb2R5KG5vZGUsIG90aGVyLCBzdXBlck1hdGNoID8gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpIDogZmFsc2UpOwogCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFdpbGRjYXJkVHlwZSBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCXJldHVybiBzdGFuZGFyZEJvZHkobm9kZSwgb3RoZXIsIHN1cGVyTWF0Y2ggPyBzdXBlci5tYXRjaChub2RlLCBvdGhlcikgOiBmYWxzZSk7Ci0JCX0KIAl9CiAJCiAJLyoqCkBAIC02ODUsMTcgKzY1Nyw2IEBACiAJfQogCiAJLyoqIEBkZXByZWNhdGVkIHVzaW5nIGRlcHJlY2F0ZWQgY29kZSAqLwotCXB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJpemVkVHlwZSgpIHsKLQkJaWYgKGFzdC5hcGlMZXZlbCgpID09IEFTVC5KTFMyKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJUGFyYW1ldGVyaXplZFR5cGUgeDEgPSBhc3QubmV3UGFyYW1ldGVyaXplZFR5cGUoYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld1NpbXBsZU5hbWUoIlgiKSkpOyAvLyROT04tTkxTLTEkCi0JCXgxLnR5cGVBcmd1bWVudHMoKS5hZGQoVDEpOwotCQl4MS50eXBlQXJndW1lbnRzKCkuYWRkKFQyKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQotCi0JLyoqIEBkZXByZWNhdGVkIHVzaW5nIGRlcHJlY2F0ZWQgY29kZSAqLwogCXB1YmxpYyB2b2lkIHRlc3RRdWFsaWZpZWRUeXBlKCkgewogCQlpZiAoYXN0LmFwaUxldmVsKCkgPT0gQVNULkpMUzIpIHsKIAkJCXJldHVybjsKQEAgLTcwNCwxNiArNjY1LDYgQEAKIAkJYmFzaWNNYXRjaCh4MSk7CiAJfQogCi0JLyoqIEBkZXByZWNhdGVkIHVzaW5nIGRlcHJlY2F0ZWQgY29kZSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXaWxkY2FyZFR5cGUoKSB7Ci0JCWlmIChhc3QuYXBpTGV2ZWwoKSA9PSBBU1QuSkxTMikgewotCQkJcmV0dXJuOwotCQl9Ci0JCVdpbGRjYXJkVHlwZSB4MSA9IGFzdC5uZXdXaWxkY2FyZFR5cGUoKTsKLQkJeDEuc2V0Qm91bmQoVDEsIHRydWUpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9Ci0KIAkvLyBFWFBSRVNTSU9OUyBhbmQgU1RBVEVNRU5UUwogCiAJcHVibGljIHZvaWQgdGVzdEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oKSB7CkBAIC03NDIsMTIgKzY5Myw2IEBACiAJCXgxLmV4cHJlc3Npb25zKCkuYWRkKEUyKTsKIAkJYmFzaWNNYXRjaCh4MSk7CiAJfQotCXB1YmxpYyB2b2lkIHRlc3RBc3NlcnRTdGF0ZW1lbnQoKSB7Ci0JCUFzc2VydFN0YXRlbWVudCB4MSA9IGFzdC5uZXdBc3NlcnRTdGF0ZW1lbnQoKTsKLQkJeDEuc2V0RXhwcmVzc2lvbihFMSk7Ci0JCXgxLnNldE1lc3NhZ2UoRTIpOwotCQliYXNpY01hdGNoKHgxKTsKLQl9CiAJcHVibGljIHZvaWQgdGVzdEFzc2lnbm1lbnQoKSB7CiAJCUFzc2lnbm1lbnQgeDEgPSBhc3QubmV3QXNzaWdubWVudCgpOwogCQl4MS5zZXRMZWZ0SGFuZFNpZGUoRTEpOwpAQCAtNzc1LDEyICs3MjAsNiBAQAogCQl4MS5zZXRMYWJlbChOMSk7CiAJCWJhc2ljTWF0Y2goeDEpOwogCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzdEV4cHJlc3Npb24oKSB7Ci0JCUNhc3RFeHByZXNzaW9uIHgxID0gYXN0Lm5ld0Nhc3RFeHByZXNzaW9uKCk7Ci0JCXgxLnNldFR5cGUoVDEpOwotCQl4MS5zZXRFeHByZXNzaW9uKEUxKTsKLQkJYmFzaWNNYXRjaCh4MSk7Ci0JfQogCXB1YmxpYyB2b2lkIHRlc3RDYXRjaENsYXVzZSgpIHsKIAkJQ2F0Y2hDbGF1c2UgeDEgPSBhc3QubmV3Q2F0Y2hDbGF1c2UoKTsKIAkJeDEuc2V0RXhjZXB0aW9uKFYxKTsKQEAgLTc5OSw3ICs3MzgsNiBAQAogCQlpZiAoYXN0LmFwaUxldmVsKCkgPT0gQVNULkpMUzIpIHsKIAkJCXgxLnNldE5hbWUoTjEpOwogCQl9IGVsc2UgewotCQkJeDEudHlwZUFyZ3VtZW50cygpLmFkZChQVDEpOwogCQkJeDEuc2V0VHlwZShUMSk7CiAJCX0KIAkJeDEuc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihBQ0QxKTsKQEAgLTgyMyw5ICs3NjEsNyBAQAogCX0KIAlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JJbnZvY2F0aW9uKCkgewogCQlDb25zdHJ1Y3Rvckludm9jYXRpb24geDEgPSBhc3QubmV3Q29uc3RydWN0b3JJbnZvY2F0aW9uKCk7Ci0JCWlmIChhc3QuYXBpTGV2ZWwoKSA+PSBBU1QuSkxTMykgewotCQkJeDEudHlwZUFyZ3VtZW50cygpLmFkZChQVDEpOwotCQl9CisJCQogCQl4MS5hcmd1bWVudHMoKS5hZGQoRTEpOwogCQl4MS5hcmd1bWVudHMoKS5hZGQoRTIpOwogCQliYXNpY01hdGNoKHgxKTsKQEAgLTk2MSw4ICs4OTcsNiBAQAogCQl9IGVsc2UgewogCQkJeDEubW9kaWZpZXJzKCkuYWRkKE1PRDEpOwogCQkJeDEubW9kaWZpZXJzKCkuYWRkKE1PRDIpOwotCQkJeDEudHlwZVBhcmFtZXRlcnMoKS5hZGQoVFAxKTsKLQkJCXgxLnR5cGVQYXJhbWV0ZXJzKCkuYWRkKFRQMik7CiAJCQl4MS5zZXRSZXR1cm5UeXBlMihUMSk7CiAJCX0KIAkJeDEuc2V0TmFtZShOMSk7CkBAIC05NzYsOSArOTEwLDcgQEAKIAlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSW52b2NhdGlvbigpIHsKIAkJRnVuY3Rpb25JbnZvY2F0aW9uIHgxID0gYXN0Lm5ld0Z1bmN0aW9uSW52b2NhdGlvbigpOwogCQl4MS5zZXRFeHByZXNzaW9uKE4xKTsKLQkJaWYgKGFzdC5hcGlMZXZlbCgpID49IEFTVC5KTFMzKSB7Ci0JCQl4MS50eXBlQXJndW1lbnRzKCkuYWRkKFBUMSk7Ci0JCX0KKwkJCiAJCXgxLnNldE5hbWUoTjIpOwogCQl4MS5hcmd1bWVudHMoKS5hZGQoRTEpOwogCQl4MS5hcmd1bWVudHMoKS5hZGQoRTIpOwpAQCAtMTA0Nyw5ICs5NzksNyBAQAogCXB1YmxpYyB2b2lkIHRlc3RTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbigpIHsKIAkJU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24geDEgPSBhc3QubmV3U3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24oKTsKIAkJeDEuc2V0RXhwcmVzc2lvbihOMSk7Ci0JCWlmIChhc3QuYXBpTGV2ZWwoKSA+PSBBU1QuSkxTMykgewotCQkJeDEudHlwZUFyZ3VtZW50cygpLmFkZChQVDEpOwotCQl9CisKIAkJeDEuYXJndW1lbnRzKCkuYWRkKEUxKTsKIAkJeDEuYXJndW1lbnRzKCkuYWRkKEUyKTsKIAkJYmFzaWNNYXRjaCh4MSk7CkBAIC0xMDYzLDkgKzk5Myw3IEBACiAJcHVibGljIHZvaWQgdGVzdFN1cGVyTWV0aG9kSW52b2NhdGlvbigpIHsKIAkJU3VwZXJNZXRob2RJbnZvY2F0aW9uIHgxID0gYXN0Lm5ld1N1cGVyTWV0aG9kSW52b2NhdGlvbigpOwogCQl4MS5zZXRRdWFsaWZpZXIoTjEpOwotCQlpZiAoYXN0LmFwaUxldmVsKCkgPj0gQVNULkpMUzMpIHsKLQkJCXgxLnR5cGVBcmd1bWVudHMoKS5hZGQoUFQxKTsKLQkJfQorCiAJCXgxLnNldE5hbWUoTjIpOwogCQl4MS5hcmd1bWVudHMoKS5hZGQoRTEpOwogCQl4MS5hcmd1bWVudHMoKS5hZGQoRTIpOwpAQCAtMTEzNSw5ICsxMDYzLDYgQEAKIAkJfSBlbHNlIHsKIAkJCXgxLm1vZGlmaWVycygpLmFkZChNT0QxKTsKIAkJCXgxLm1vZGlmaWVycygpLmFkZChNT0QyKTsKLQkJCXgxLnR5cGVQYXJhbWV0ZXJzKCkuYWRkKFRQMSk7Ci0JCQl4MS50eXBlUGFyYW1ldGVycygpLmFkZChUUDIpOwotCQkJeDEuc2V0U3VwZXJjbGFzc1R5cGUoUFQxKTsKIAkJCXgxLnN1cGVySW50ZXJmYWNlVHlwZXMoKS5hZGQoVDEpOwogCQkJeDEuc3VwZXJJbnRlcmZhY2VUeXBlcygpLmFkZChUMik7CiAJCX0KQEAgLTExNTQsMTcgKzEwNzksNiBAQAogCQl4MS5zZXRUeXBlKFQxKTsKIAkJYmFzaWNNYXRjaCh4MSk7CiAJfQotCS8qKiBAZGVwcmVjYXRlZCB1c2luZyBkZXByZWNhdGVkIGNvZGUgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZVBhcmFtZXRlcigpIHsKLQkJaWYgKGFzdC5hcGlMZXZlbCgpID09IEFTVC5KTFMyKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVHlwZVBhcmFtZXRlciB4MSA9IGFzdC5uZXdUeXBlUGFyYW1ldGVyKCk7Ci0JCXgxLnNldE5hbWUoTjEpOwotCQl4MS50eXBlQm91bmRzKCkuYWRkKFQxKTsKLQkJeDEudHlwZUJvdW5kcygpLmFkZChUMik7Ci0JCWJhc2ljTWF0Y2goeDEpOwotCX0KIAlwdWJsaWMgdm9pZCB0ZXN0VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCkgewogCQlWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgeDEgPSBhc3QubmV3VmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KCk7CiAJCXgxLnNldE5hbWUoTjEpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQVNUTW9kZWxCcmlkZ2VUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQVNUTW9kZWxCcmlkZ2VUZXN0cy5qYXZhCmluZGV4IDFmODczNDUuLmU4MDY3YmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0FTVE1vZGVsQnJpZGdlVGVzdHMuamF2YQorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9BU1RNb2RlbEJyaWRnZVRlc3RzLmphdmEKQEAgLTEzODMsNDYgKzEzODMsNiBAQAogCX0KIAogCS8qCi0JICogRW5zdXJlcyB0aGF0IHRoZSBJSmF2YVNjcmlwdEVsZW1lbnQgb2YgYW4gSUJpbmRpbmcgcmVwcmVzZW50aW5nIGEgcGFyYW1ldGVyIHR5cGUgaXMgY29ycmVjdC4KLQkgKiAocmVncmVzc2lvbiB0ZXN0IGZvciBidWcgNzg5MzAgSVR5cGVCaW5kaW5nI2dldEphdmFFbGVtZW50KCkgdGhyb3dzIE5QRSBmb3IgdHlwZSB2YXJpYWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZVBhcmFtZXRlcigpIHRocm93cyBKYXZhU2NyaXB0TW9kZWxFeGNlcHRpb24gewotCQlBU1ROb2RlIG5vZGUgPSBidWlsZEFTVCgKLQkJCSJwdWJsaWMgY2xhc3MgWDwvKnN0YXJ0Ki9ULyplbmQqLz4ge1xuIiArCi0JCQkifSIKLQkJKTsKLQkJSUJpbmRpbmcgYmluZGluZyA9ICgoVHlwZVBhcmFtZXRlcikgbm9kZSkucmVzb2x2ZUJpbmRpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gYmluZGluZyIsIGJpbmRpbmcpOwotCQlJSmF2YVNjcmlwdEVsZW1lbnQgZWxlbWVudCA9IGJpbmRpbmcuZ2V0SmF2YUVsZW1lbnQoKTsKLQkJYXNzZXJ0RWxlbWVudEVxdWFscygKLQkJCSJVbmV4cGVjdGVkIEphdmEgZWxlbWVudCIsCi0JCQkiPFQ+IFtpbiBYIFtpbiBbV29ya2luZyBjb3B5XSBYLmphdmEgW2luIDxkZWZhdWx0PiBbaW4gc3JjIFtpbiBQXV1dXV0iLAotCQkJZWxlbWVudAotCQkpOwotCQlhc3NlcnRUcnVlKCJFbGVtZW50IHNob3VsZCBleGlzdCIsIGVsZW1lbnQuZXhpc3RzKCkpOwotCX0KLQotCS8qCi0JICogRW5zdXJlcyB0aGF0IHRoZSBJSmF2YVNjcmlwdEVsZW1lbnQgb2YgYW4gSUJpbmRpbmcgcmVwcmVzZW50aW5nIGEgd2lsZCBjYXJkIGlzIGNvcnJlY3QuCi0JICogKHJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIDgxNDE3IFtkb21dIGdldEphdmFFbGVtZW50KCkgdGhyb3dzIGEgTlBFIGZvciBXaWxkY2FyZEJpbmRpbmcpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdpbGRDYXJkKCkgdGhyb3dzIEphdmFTY3JpcHRNb2RlbEV4Y2VwdGlvbiB7Ci0JCUFTVE5vZGUgbm9kZSA9IGJ1aWxkQVNUKAotCQkJInB1YmxpYyBjbGFzcyBYPFQ+IHtcbiIgKyAKLQkJCSIJWDwvKnN0YXJ0Ki8/IGV4dGVuZHMgRXhjZXB0aW9uLyplbmQqLz4gZmllbGQ7XG4iICsgCi0JCQkifSIKLQkJKTsKLQkJSUJpbmRpbmcgYmluZGluZyA9ICgoV2lsZGNhcmRUeXBlKSBub2RlKS5yZXNvbHZlQmluZGluZygpOwotCQlhc3NlcnROb3ROdWxsKCJObyBiaW5kaW5nIiwgYmluZGluZyk7Ci0JCUlKYXZhU2NyaXB0RWxlbWVudCBlbGVtZW50ID0gYmluZGluZy5nZXRKYXZhRWxlbWVudCgpOwotCQlhc3NlcnRFbGVtZW50RXF1YWxzKAotCQkJIlVuZXhwZWN0ZWQgSmF2YSBlbGVtZW50IiwKLQkJCSI8bnVsbD4iLAotCQkJZWxlbWVudAotCQkpOwotCX0KLQotCS8qCiAJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2MDYzNwogCSAqLwogCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVCaW5kaW5nczE5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQVNUVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQVNUVGVzdC5qYXZhCmluZGV4IDY3NWEzODEuLmI5YTVmZDUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0FTVFRlc3QuamF2YQorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9BU1RUZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMzIsMTQgKzMyLDEyIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQXJyYXlDcmVhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFycmF5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Bc3NlcnRTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQXNzaWdubWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5CbG9jazsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5CbG9ja0NvbW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkJvb2xlYW5MaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkJyZWFrU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkNhc3RFeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkNhdGNoQ2xhdXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkNoYXJhY3RlckxpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ2xhc3NJbnN0YW5jZUNyZWF0aW9uOwpAQCAtNzQsNyArNzIsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLk51bGxMaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlBhcmFtZXRlcml6ZWRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlBvc3RmaXhFeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlByZWZpeEV4cHJlc3Npb247CkBAIC0xMDEsMTIgKzk4LDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvblN0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5UeXBlUGFyYW1ldGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLldoaWxlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLldpbGRjYXJkVHlwZTsKIAogLy8gdGVzdGluZwogCkBAIC0xNzQsMTQgKzE2OSw2IEBACiAJCX0KIAkKIAkJLyoqCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChBc3NlcnRTdGF0ZW1lbnQsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKEFzc2VydFN0YXRlbWVudCBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCiAJCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChBc3NpZ25tZW50LCBPYmplY3QpCiAJCSAqLwogCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChBc3NpZ25tZW50IG5vZGUsIE9iamVjdCBvdGhlcikgewpAQCAtMjIzLDE0ICsyMTAsNiBAQAogCQl9CiAJCiAJCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goQ2FzdEV4cHJlc3Npb24sIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKENhc3RFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKIAkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKENhdGNoQ2xhdXNlLCBPYmplY3QpCiAJCSAqLwogCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChDYXRjaENsYXVzZSBub2RlLCBPYmplY3Qgb3RoZXIpIHsKQEAgLTQ4OSwxNSArNDY4LDYgQEAKIAkJfQogCQogCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKFBhcmFtZXRlcml6ZWRUeXBlLCBPYmplY3QpCi0JCSAqIEBzaW5jZSAzLjAKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFBhcmFtZXRlcml6ZWRUeXBlIG5vZGUsIE9iamVjdCBvdGhlcikgewotCQkJY2hlY2tQb3NpdGlvbnMobm9kZSwgb3RoZXIpOwotCQkJcmV0dXJuIHN1cGVyLm1hdGNoKG5vZGUsIG90aGVyKTsKLQkJfQotCQotCQkvKioKIAkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uLCBPYmplY3QpCiAJCSAqLwogCQlwdWJsaWMgYm9vbGVhbiBtYXRjaChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlLCBPYmplY3Qgb3RoZXIpIHsKQEAgLTY5NSwxNSArNjY1LDYgQEAKIAkJfQogCQogCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5BU1RNYXRjaGVyI21hdGNoKFR5cGVQYXJhbWV0ZXIsIE9iamVjdCkKLQkJICogQHNpbmNlIDMuMAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbWF0Y2goVHlwZVBhcmFtZXRlciBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkKLQkJLyoqCiAJCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQVNUTWF0Y2hlciNtYXRjaChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiwgT2JqZWN0KQogCQkgKi8KIAkJcHVibGljIGJvb2xlYW4gbWF0Y2goVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IG90aGVyKSB7CkBAIC03MzQsMTYgKzY5NSw2IEBACiAJCQljaGVja1Bvc2l0aW9ucyhub2RlLCBvdGhlcik7CiAJCQlyZXR1cm4gc3VwZXIubWF0Y2gobm9kZSwgb3RoZXIpOwogCQl9Ci0JCi0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFTVE1hdGNoZXIjbWF0Y2goV2lsZGNhcmRUeXBlLCBPYmplY3QpCi0JCSAqIEBzaW5jZSAzLjAKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIG1hdGNoKFdpbGRjYXJkVHlwZSBub2RlLCBPYmplY3Qgb3RoZXIpIHsKLQkJCWNoZWNrUG9zaXRpb25zKG5vZGUsIG90aGVyKTsKLQkJCXJldHVybiBzdXBlci5tYXRjaChub2RlLCBvdGhlcik7Ci0JCX0KLQkJCiAJfQogCQogCS8qKiBAZGVwcmVjYXRlZCB1c2luZyBkZXByZWNhdGVkIGNvZGUgKi8KQEAgLTE5MDEsOSArMTg1Miw3IEBACiAJCWFzc2VydFRydWUoeC5pc1NpbXBsZVR5cGUoKSk7CiAJCWFzc2VydFRydWUoIXguaXNBcnJheVR5cGUoKSk7CiAJCWFzc2VydFRydWUoIXguaXNQcmltaXRpdmVUeXBlKCkpOwotCQlhc3NlcnRUcnVlKCF4LmlzUGFyYW1ldGVyaXplZFR5cGUoKSk7CiAJCWFzc2VydFRydWUoIXguaXNRdWFsaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRUcnVlKCF4LmlzV2lsZGNhcmRUeXBlKCkpOwogCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlNJTVBMRV9UWVBFKTsKIAkJYXNzZXJ0VHJ1ZSh4LnN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZSgpID09IFNpbXBsZVR5cGUucHJvcGVydHlEZXNjcmlwdG9ycyhhc3QuYXBpTGV2ZWwoKSkpOwogCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudApAQCAtMTkzNyw5ICsxODg2LDcgQEAKIAkJYXNzZXJ0VHJ1ZSgheC5pc1NpbXBsZVR5cGUoKSk7CiAJCWFzc2VydFRydWUoIXguaXNBcnJheVR5cGUoKSk7CiAJCWFzc2VydFRydWUoeC5pc1ByaW1pdGl2ZVR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIXguaXNQYXJhbWV0ZXJpemVkVHlwZSgpKTsKIAkJYXNzZXJ0VHJ1ZSgheC5pc1F1YWxpZmllZFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIXguaXNXaWxkY2FyZFR5cGUoKSk7CiAJCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuUFJJTUlUSVZFX1RZUEUpOwogCQlhc3NlcnRUcnVlKHguc3RydWN0dXJhbFByb3BlcnRpZXNGb3JUeXBlKCkgPT0gUHJpbWl0aXZlVHlwZS5wcm9wZXJ0eURlc2NyaXB0b3JzKGFzdC5hcGlMZXZlbCgpKSk7CiAJCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50CkBAIC0yMDE0LDkgKzE5NjEsNyBAQAogCQlhc3NlcnRUcnVlKCF4LmlzU2ltcGxlVHlwZSgpKTsKIAkJYXNzZXJ0VHJ1ZSh4LmlzQXJyYXlUeXBlKCkpOwogCQlhc3NlcnRUcnVlKCF4LmlzUHJpbWl0aXZlVHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgheC5pc1BhcmFtZXRlcml6ZWRUeXBlKCkpOwogCQlhc3NlcnRUcnVlKCF4LmlzUXVhbGlmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgheC5pc1dpbGRjYXJkVHlwZSgpKTsKIAkJYXNzZXJ0VHJ1ZSh4LmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9UWVBFKTsKIAkJYXNzZXJ0VHJ1ZSh4LnN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZSgpID09IEFycmF5VHlwZS5wcm9wZXJ0eURlc2NyaXB0b3JzKGFzdC5hcGlMZXZlbCgpKSk7CiAKQEAgLTIwNTQsODYgKzE5OTksNiBAQAogCQlhc3NlcnRUcnVlKHguZ2V0RGltZW5zaW9ucygpID09IDUpOwogCQlhc3NlcnRUcnVlKHguZ2V0RWxlbWVudFR5cGUoKS5pc1ByaW1pdGl2ZVR5cGUoKSk7CiAJfQkJCi0KLQkvKiogQGRlcHJlY2F0ZWQgdXNpbmcgZGVwcmVjYXRlZCBjb2RlICovCi0JcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlcml6ZWRUeXBlKCkgewotCQlpZiAoYXN0LmFwaUxldmVsKCkgPT0gQVNULkpMUzIpIHsKLQkJCS8vIG5vZGUgdHlwZSBpbnRyb2R1Y2VkIGluIDMuMCBBUEkKLQkJCXRyeSB7Ci0JCQkJYXN0Lm5ld1BhcmFtZXRlcml6ZWRUeXBlKGFzdC5uZXdTaW1wbGVUeXBlKGFzdC5uZXdTaW1wbGVOYW1lKCJTdHJpbmciKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJYXNzZXJ0VHJ1ZShmYWxzZSk7Ci0JCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcGFzcwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlUeXBlIHQgPSBhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3U2ltcGxlTmFtZSgiU3RyaW5nIikpOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFBhcmFtZXRlcml6ZWRUeXBlIHggPSBhc3QubmV3UGFyYW1ldGVyaXplZFR5cGUodCk7IAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFR5cGUoKSA9PSB0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFR5cGUoKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSgheC5pc1NpbXBsZVR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIXguaXNBcnJheVR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIXguaXNQcmltaXRpdmVUeXBlKCkpOwotCQlhc3NlcnRUcnVlKHguaXNQYXJhbWV0ZXJpemVkVHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgheC5pc1F1YWxpZmllZFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIXguaXNXaWxkY2FyZFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuUEFSQU1FVEVSSVpFRF9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZSh4LnR5cGVBcmd1bWVudHMoKS5zaXplKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUoeC5zdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoKSA9PSBQYXJhbWV0ZXJpemVkVHlwZS5wcm9wZXJ0eURlc2NyaXB0b3JzKGFzdC5hcGlMZXZlbCgpKSk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQkJZ2VuZXJpY1Byb3BlcnR5VGVzdCh4LCBuZXcgUHJvcGVydHkoIlR5cGUiLCB0cnVlLCBUeXBlLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJU2ltcGxlVHlwZSByZXN1bHQgPSAKLQkJCQl0YXJnZXRBc3QubmV3U2ltcGxlVHlwZSgKLQkJCQkJCXRhcmdldEFzdC5uZXdTaW1wbGVOYW1lKCJhIikpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdBcnJheVR5cGUocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJUGFyYW1ldGVyaXplZFR5cGUgczEgPSBhc3QubmV3UGFyYW1ldGVyaXplZFR5cGUoeCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJUGFyYW1ldGVyaXplZFR5cGUgczEgPSAoUGFyYW1ldGVyaXplZFR5cGUpIHguZ2V0UGFyZW50KCk7Ci0JCQkJczEuc2V0VHlwZShhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3U2ltcGxlTmFtZSgieiIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRUeXBlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0VHlwZSgoVHlwZSkgdmFsdWUpOwotCQkJfQotCQl9KTsKLQkJZ2VuZXJpY1Byb3BlcnR5TGlzdFRlc3QoeCwgeC50eXBlQXJndW1lbnRzKCksCi0JCSAgbmV3IFByb3BlcnR5KCJBcmd1bWVudHMiLCB0cnVlLCBUeXBlLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJUHJpbWl0aXZlVHlwZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3UHJpbWl0aXZlVHlwZShQcmltaXRpdmVUeXBlLklOVCk7Ci0JCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCXRhcmdldEFzdC5uZXdBcnJheVR5cGUocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIHdyYXAoKSB7Ci0JCQkJLy8gcmV0dXJuIFR5cGUgdGhhdCBlbWJlZHMgeAotCQkJCVBhcmFtZXRlcml6ZWRUeXBlIHMxID0gYXN0Lm5ld1BhcmFtZXRlcml6ZWRUeXBlKGFzdC5uZXdTaW1wbGVUeXBlKGFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJczEudHlwZUFyZ3VtZW50cygpLmFkZCh4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJUGFyYW1ldGVyaXplZFR5cGUgczEgPSAoUGFyYW1ldGVyaXplZFR5cGUpIHguZ2V0UGFyZW50KCk7Ci0JCQkJczEudHlwZUFyZ3VtZW50cygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJfSk7Ci0JfQkJCiAJCiAJLyoqIEBkZXByZWNhdGVkIHVzaW5nIGRlcHJlY2F0ZWQgY29kZSAqLwogCXB1YmxpYyB2b2lkIHRlc3RRdWFsaWZpZWRUeXBlKCkgewpAQCAtMjE2NCw5ICsyMDI5LDcgQEAKIAkJYXNzZXJ0VHJ1ZSgheC5pc1NpbXBsZVR5cGUoKSk7CiAJCWFzc2VydFRydWUoIXguaXNBcnJheVR5cGUoKSk7CiAJCWFzc2VydFRydWUoIXguaXNQcmltaXRpdmVUeXBlKCkpOwotCQlhc3NlcnRUcnVlKCF4LmlzUGFyYW1ldGVyaXplZFR5cGUoKSk7CiAJCWFzc2VydFRydWUoeC5pc1F1YWxpZmllZFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIXguaXNXaWxkY2FyZFR5cGUoKSk7CiAJCWFzc2VydFRydWUoeC5zdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoKSA9PSBRdWFsaWZpZWRUeXBlLnByb3BlcnR5RGVzY3JpcHRvcnMoYXN0LmFwaUxldmVsKCkpKTsKIAkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKIAkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKQEAgLTIyMTIsOTQgKzIwNzUsNyBAQAogCQkJCXguc2V0TmFtZSgoU2ltcGxlTmFtZSkgdmFsdWUpOwogCQkJfQogCQl9KTsKLQl9CQkKLQotCS8qKiBAZGVwcmVjYXRlZCB1c2luZyBkZXByZWNhdGVkIGNvZGUgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2lsZGNhcmRUeXBlKCkgewotCQlpZiAoYXN0LmFwaUxldmVsKCkgPT0gQVNULkpMUzIpIHsKLQkJCS8vIG5vZGUgdHlwZSBpbnRyb2R1Y2VkIGluIDMuMCBBUEkKLQkJCXRyeSB7Ci0JCQkJYXN0Lm5ld1dpbGRjYXJkVHlwZSgpOwotCQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIHBhc3MKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgV2lsZGNhcmRUeXBlIHggPSBhc3QubmV3V2lsZGNhcmRUeXBlKCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0Qm91bmQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmlzVXBwZXJCb3VuZCgpID09IHRydWUpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLldJTERDQVJEX1RZUEUpOwotCQlhc3NlcnRUcnVlKCF4LmlzU2ltcGxlVHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgheC5pc0FycmF5VHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgheC5pc1ByaW1pdGl2ZVR5cGUoKSk7Ci0JCWFzc2VydFRydWUoIXguaXNQYXJhbWV0ZXJpemVkVHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgheC5pc1F1YWxpZmllZFR5cGUoKSk7Ci0JCWFzc2VydFRydWUoeC5pc1dpbGRjYXJkVHlwZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh4LnN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZSgpID09IFdpbGRjYXJkVHlwZS5wcm9wZXJ0eURlc2NyaXB0b3JzKGFzdC5hcGlMZXZlbCgpKSk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQkJLy8gbWFrZSBzdXJlIHRoYXQgaXNVcHBlckJvdW5kIHdvcmtzCi0JCVR5cGUgYiA9IGFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUuQllURSk7Ci0JCXguc2V0Qm91bmQoYik7Ci0JCXguc2V0VXBwZXJCb3VuZChmYWxzZSk7Ci0JCWFzc2VydFRydWUoeC5pc1VwcGVyQm91bmQoKSA9PSBmYWxzZSk7Ci0JCXguc2V0VXBwZXJCb3VuZCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSh4LmlzVXBwZXJCb3VuZCgpID09IHRydWUpOwotCQl4LnNldEJvdW5kKG51bGwpOwotCQl4LnNldFVwcGVyQm91bmQoZmFsc2UpOwotCQlhc3NlcnRUcnVlKHguaXNVcHBlckJvdW5kKCkgPT0gZmFsc2UpOwotCQl4LnNldFVwcGVyQm91bmQodHJ1ZSk7Ci0JCWFzc2VydFRydWUoeC5pc1VwcGVyQm91bmQoKSA9PSB0cnVlKTsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB0aGF0IHNldEJvdW5kKFR5cGUsYm9vbGVhbikgd29ya3MKLQkJeC5zZXRCb3VuZChiLCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoeC5nZXRCb3VuZCgpID09IGIpOwotCQlhc3NlcnRUcnVlKHguaXNVcHBlckJvdW5kKCkgPT0gZmFsc2UpOwotCQl4LnNldEJvdW5kKG51bGwsIHRydWUpOwotCQlhc3NlcnRUcnVlKHguZ2V0Qm91bmQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmlzVXBwZXJCb3VuZCgpID09IHRydWUpOwotCQl4LnNldEJvdW5kKGIsIHRydWUpOwotCQlhc3NlcnRUcnVlKHguZ2V0Qm91bmQoKSA9PSBiKTsKLQkJYXNzZXJ0VHJ1ZSh4LmlzVXBwZXJCb3VuZCgpID09IHRydWUpOwotCQl4LnNldEJvdW5kKG51bGwsIGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEJvdW5kKCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5pc1VwcGVyQm91bmQoKSA9PSBmYWxzZSk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiQm91bmQiLCBmYWxzZSwgVHlwZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZVR5cGUgcmVzdWx0ID0gCi0JCQkJdGFyZ2V0QXN0Lm5ld1NpbXBsZVR5cGUoCi0JCQkJCQl0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiYSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3QXJyYXlUeXBlKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCVdpbGRjYXJkVHlwZSBzMSA9IGFzdC5uZXdXaWxkY2FyZFR5cGUoKTsKLQkJCQlzMS5zZXRCb3VuZCh4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJV2lsZGNhcmRUeXBlIHMxID0gKFdpbGRjYXJkVHlwZSkgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMS5zZXRCb3VuZChudWxsKTsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRCb3VuZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldEJvdW5kKChUeXBlKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQl9CQkKKwl9CQkJCQogCiAJcHVibGljIHZvaWQgdGVzdFBhY2thZ2VEZWNsYXJhdGlvbigpIHsKIAkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7CkBAIC0yNTkyLDE5ICsyMzY4LDYgQEAKIAkJCX0KIAkJfSk7CiAJCQotCQlpZiAoYXN0LmFwaUxldmVsKCkgPj0gQVNULkpMUzMpIHsKLQkJCWdlbmVyaWNQcm9wZXJ0eUxpc3RUZXN0KHgsIHgudHlwZVBhcmFtZXRlcnMoKSwKLQkJCSAgbmV3IFByb3BlcnR5KCJUeXBlUGFyYW1ldGVycyIsIHRydWUsIFR5cGVQYXJhbWV0ZXIuY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJCVR5cGVQYXJhbWV0ZXIgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1R5cGVQYXJhbWV0ZXIoKTsKLQkJCQkJaWYgKHBhcmVudGVkKSB7Ci0JCQkJCQl0YXJnZXRBc3QubmV3RnVuY3Rpb25EZWNsYXJhdGlvbigpLnR5cGVQYXJhbWV0ZXJzKCkuYWRkKHJlc3VsdCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKIAkJaWYgKGFzdC5hcGlMZXZlbCgpID09IEFTVC5KTFMyKSB7CiAJCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiU3VwZXJjbGFzcyIsIGZhbHNlLCBOYW1lLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKIAkJCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewpAQCAtMjczNSw1OSArMjQ5OCw2IEBACiAJCiAJfQkKIAkKLQkKLQkvKiogQGRlcHJlY2F0ZWQgdXNpbmcgZGVwcmVjYXRlZCBjb2RlICovCi0JcHVibGljIHZvaWQgdGVzdFR5cGVQYXJhbWV0ZXIoKSB7Ci0JCWlmIChhc3QuYXBpTGV2ZWwoKSA9PSBBU1QuSkxTMikgewotCQkJLy8gbm9kZSB0eXBlIGludHJvZHVjZWQgaW4gMy4wIEFQSQotCQkJdHJ5IHsKLQkJCQlhc3QubmV3VHlwZVBhcmFtZXRlcigpOwotCQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIHBhc3MKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJZmluYWwgVHlwZVBhcmFtZXRlciB4ID0gYXN0Lm5ld1R5cGVQYXJhbWV0ZXIoKTsKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA+IHByZXZpb3VzQ291bnQpOwotCQlwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWFzc2VydFRydWUoeC5nZXRBU1QoKSA9PSBhc3QpOwotCQlhc3NlcnRUcnVlKHguZ2V0UGFyZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXROYW1lKCkuZ2V0UGFyZW50KCkgPT0geCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFlQRV9QQVJBTUVURVIpOwotCQlhc3NlcnRUcnVlKHgudHlwZUJvdW5kcygpLnNpemUoKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh4LnN0cnVjdHVyYWxQcm9wZXJ0aWVzRm9yVHlwZSgpID09IFR5cGVQYXJhbWV0ZXIucHJvcGVydHlEZXNjcmlwdG9ycyhhc3QuYXBpTGV2ZWwoKSkpOwotCQkvLyBtYWtlIHN1cmUgdGhhdCByZWFkaW5nIGRpZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiBjb3VudAotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID09IHByZXZpb3VzQ291bnQpOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJOYW1lIiwgdHJ1ZSwgU2ltcGxlTmFtZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldE5hbWUoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXROYW1lKChTaW1wbGVOYW1lKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCQlnZW5lcmljUHJvcGVydHlMaXN0VGVzdCh4LCB4LnR5cGVCb3VuZHMoKSwKLQkJICBuZXcgUHJvcGVydHkoIlR5cGVCb3VuZHMiLCB0cnVlLCBUeXBlLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBBU1ROb2RlIHNhbXBsZShBU1QgdGFyZ2V0QXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJVHlwZSByZXN1bHQgPSB0YXJnZXRBc3QubmV3U2ltcGxlVHlwZSh0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiZm9vIikpOwotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3QXJyYXlUeXBlKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0pOwotCX0JCQotCQogCS8qKiBAZGVwcmVjYXRlZCB1c2luZyBkZXByZWNhdGVkIGNvZGUgKi8KIAlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbigpIHsKIAkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7CkBAIC0zMDYyLDE5ICsyNzcyLDYgQEAKIAogCQl0SmF2YWRvY0NvbW1lbnQoeCk7CiAJCQkJCQkKLQkJaWYgKGFzdC5hcGlMZXZlbCgpID49IEFTVC5KTFMzKSB7Ci0JCQlnZW5lcmljUHJvcGVydHlMaXN0VGVzdCh4LCB4LnR5cGVQYXJhbWV0ZXJzKCksCi0JCQkgIG5ldyBQcm9wZXJ0eSgiVHlwZVBhcmFtZXRlcnMiLCB0cnVlLCBUeXBlUGFyYW1ldGVyLmNsYXNzKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCQlUeXBlUGFyYW1ldGVyIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdUeXBlUGFyYW1ldGVyKCk7Ci0JCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQkJdGFyZ2V0QXN0Lm5ld0Z1bmN0aW9uRGVjbGFyYXRpb24oKS50eXBlUGFyYW1ldGVycygpLmFkZChyZXN1bHQpOwotCQkJCQl9Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJCiAJCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJOYW1lIiwgdHJ1ZSwgU2ltcGxlTmFtZS5jbGFzcykgeyAvLyROT04tTkxTLTEkCiAJCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIHRhcmdldEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewogCQkJCVNpbXBsZU5hbWUgcmVzdWx0ID0gdGFyZ2V0QXN0Lm5ld1NpbXBsZU5hbWUoImZvbyIpOyAvLyROT04tTkxTLTEkCkBAIC01MjgyLDkyICs0OTc5LDYgQEAKIAkvKioKIAkgKiBAZGVwcmVjYXRlZCAoVXNlcyBnZXRMZWFkaW5nQ29tbWVudCgpIHdoaWNoIGlzIGRlcHJlY2F0ZWQpCiAJICovCi0JcHVibGljIHZvaWQgdGVzdEFzc2VydFN0YXRlbWVudCgpIHsKLQkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7Ci0JCWZpbmFsIEFzc2VydFN0YXRlbWVudCB4ID0gYXN0Lm5ld0Fzc2VydFN0YXRlbWVudCgpOwotCQlhc3NlcnRUcnVlKGFzdC5tb2RpZmljYXRpb25Db3VudCgpID4gcHJldmlvdXNDb3VudCk7Ci0JCXByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEFTVCgpID09IGFzdCk7Ci0JCWFzc2VydFRydWUoeC5nZXRQYXJlbnQoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldEV4cHJlc3Npb24oKS5nZXRQYXJlbnQoKSA9PSB4KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldE1lc3NhZ2UoKSA9PSBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldExlYWRpbmdDb21tZW50KCkgPT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoeC5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVNTRVJUX1NUQVRFTUVOVCk7Ci0JCWFzc2VydFRydWUoeC5zdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoKSA9PSAKLQkJCUFzc2VydFN0YXRlbWVudC5wcm9wZXJ0eURlc2NyaXB0b3JzKGFzdC5hcGlMZXZlbCgpKSk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGF0IHJlYWRpbmcgZGlkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGNvdW50Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPT0gcHJldmlvdXNDb3VudCk7Ci0KLQkJdExlYWRpbmdDb21tZW50KHgpOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJFeHByZXNzaW9uIiwgdHJ1ZSwgRXhwcmVzc2lvbi5jbGFzcykgeyAvLyROT04tTkxTLTEkCi0JCQlwdWJsaWMgQVNUTm9kZSBzYW1wbGUoQVNUIGxvY2FsQXN0LCBib29sZWFuIHBhcmVudGVkKSB7Ci0JCQkJRXhwcmVzc2lvbiByZXN1bHQgPSBsb2NhbEFzdC5uZXdTaW1wbGVOYW1lKCJmb28iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQlsb2NhbEFzdC5uZXdFeHByZXNzaW9uU3RhdGVtZW50KHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSB3cmFwKCkgewotCQkJCS8vIHJldHVybiBFeHByZXNzaW9uIHRoYXQgZW1iZWRzIHgKLQkJCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gczEgPSBhc3QubmV3Q2xhc3NJbnN0YW5jZUNyZWF0aW9uKCk7Ci0JCQkJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBhMSA9IGFzdC5uZXdBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKCk7Ci0JCQkJczEuc2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbihhMSk7Ci0JCQkJRnVuY3Rpb25EZWNsYXJhdGlvbiBzMiA9IGFzdC5uZXdGdW5jdGlvbkRlY2xhcmF0aW9uKCk7Ci0JCQkJYTEuYm9keURlY2xhcmF0aW9ucygpLmFkZChzMik7Ci0JCQkJQmxvY2sgczMgPSBhc3QubmV3QmxvY2soKTsKLQkJCQlzMi5zZXRCb2R5KHMzKTsKLQkJCQlzMy5zdGF0ZW1lbnRzKCkuYWRkKHgpOwotCQkJCXJldHVybiBzMTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHVud3JhcCgpIHsKLQkJCQlCbG9jayBzMyA9IChCbG9jaykgeC5nZXRQYXJlbnQoKTsKLQkJCQlzMy5zdGF0ZW1lbnRzKCkucmVtb3ZlKHgpOwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEV4cHJlc3Npb24oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWdlbmVyaWNQcm9wZXJ0eVRlc3QoeCwgbmV3IFByb3BlcnR5KCJNZXNzYWdlIiwgZmFsc2UsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCBsb2NhbEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUV4cHJlc3Npb24gcmVzdWx0ID0gbG9jYWxBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJbG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQkvLyByZXR1cm4gRXhwcmVzc2lvbiB0aGF0IGVtYmVkcyB4Ci0JCQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIHMxID0gYXN0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwotCQkJCUFub255bW91c0NsYXNzRGVjbGFyYXRpb24gYTEgPSBhc3QubmV3QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCQkJCXMxLnNldEFub255bW91c0NsYXNzRGVjbGFyYXRpb24oYTEpOwotCQkJCUZ1bmN0aW9uRGVjbGFyYXRpb24gczIgPSBhc3QubmV3RnVuY3Rpb25EZWNsYXJhdGlvbigpOwotCQkJCWExLmJvZHlEZWNsYXJhdGlvbnMoKS5hZGQoczIpOwotCQkJCUJsb2NrIHMzID0gYXN0Lm5ld0Jsb2NrKCk7Ci0JCQkJczIuc2V0Qm9keShzMyk7Ci0JCQkJczMuc3RhdGVtZW50cygpLmFkZCh4KTsKLQkJCQlyZXR1cm4gczE7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB1bndyYXAoKSB7Ci0JCQkJQmxvY2sgczMgPSAoQmxvY2spIHguZ2V0UGFyZW50KCk7Ci0JCQkJczMuc3RhdGVtZW50cygpLnJlbW92ZSh4KTsKLQkJCX0KLQkJCXB1YmxpYyBBU1ROb2RlIGdldCgpIHsKLQkJCQlyZXR1cm4geC5nZXRNZXNzYWdlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzZXQoQVNUTm9kZSB2YWx1ZSkgewotCQkJCXguc2V0TWVzc2FnZSgoRXhwcmVzc2lvbikgdmFsdWUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAoVXNlcyBnZXRMZWFkaW5nQ29tbWVudCgpIHdoaWNoIGlzIGRlcHJlY2F0ZWQpCi0JICovCiAJcHVibGljIHZvaWQgdGVzdFN3aXRjaFN0YXRlbWVudCgpIHsKIAkJbG9uZyBwcmV2aW91c0NvdW50ID0gYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCk7CiAJCWZpbmFsIFN3aXRjaFN0YXRlbWVudCB4ID0gYXN0Lm5ld1N3aXRjaFN0YXRlbWVudCgpOwpAQCAtNTYzMywxMCArNTI0NCw2IEBACiAJCQkJYXNzZXJ0VHJ1ZShub2RlLnJlc29sdmVCaW5kaW5nKCkgPT0gbnVsbCk7CiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQYXJhbWV0ZXJpemVkVHlwZSBub2RlKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShub2RlLnJlc29sdmVCaW5kaW5nKCkgPT0gbnVsbCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9CiAJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQcmltaXRpdmVUeXBlIG5vZGUpIHsKIAkJCQlhc3NlcnRUcnVlKG5vZGUucmVzb2x2ZUJpbmRpbmcoKSA9PSBudWxsKTsKIAkJCQlyZXR1cm4gdHJ1ZTsKQEAgLTU2NDUsMTAgKzUyNTIsNiBAQAogCQkJCWFzc2VydFRydWUobm9kZS5yZXNvbHZlQmluZGluZygpID09IG51bGwpOwogCQkJCXJldHVybiB0cnVlOwogCQkJfQotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoV2lsZGNhcmRUeXBlIG5vZGUpIHsKLQkJCQlhc3NlcnRUcnVlKG5vZGUucmVzb2x2ZUJpbmRpbmcoKSA9PSBudWxsKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KIAkJCQogCQkJLy8gRVhQUkVTU0lPTlMKIAkKQEAgLTYzNDIsNjQgKzU5NDUsNiBAQAogCQl9KTsKIAl9CiAKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzdEV4cHJlc3Npb24oKSB7Ci0JCWxvbmcgcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlmaW5hbCBDYXN0RXhwcmVzc2lvbiB4ID0gYXN0Lm5ld0Nhc3RFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoYXN0Lm1vZGlmaWNhdGlvbkNvdW50KCkgPiBwcmV2aW91c0NvdW50KTsKLQkJcHJldmlvdXNDb3VudCA9IGFzdC5tb2RpZmljYXRpb25Db3VudCgpOwotCQlhc3NlcnRUcnVlKHguZ2V0QVNUKCkgPT0gYXN0KTsKLQkJYXNzZXJ0VHJ1ZSh4LmdldFBhcmVudCgpID09IG51bGwpOwotCQlhc3NlcnRUcnVlKHguZ2V0VHlwZSgpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0RXhwcmVzc2lvbigpLmdldFBhcmVudCgpID09IHgpOwotCQlhc3NlcnRUcnVlKHguZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkNBU1RfRVhQUkVTU0lPTik7Ci0JCWFzc2VydFRydWUoeC5zdHJ1Y3R1cmFsUHJvcGVydGllc0ZvclR5cGUoKSA9PSAKLQkJCUNhc3RFeHByZXNzaW9uLnByb3BlcnR5RGVzY3JpcHRvcnMoYXN0LmFwaUxldmVsKCkpKTsKLQkJLy8gbWFrZSBzdXJlIHRoYXQgcmVhZGluZyBkaWQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gY291bnQKLQkJYXNzZXJ0VHJ1ZShhc3QubW9kaWZpY2F0aW9uQ291bnQoKSA9PSBwcmV2aW91c0NvdW50KTsKLQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiVHlwZSIsIHRydWUsIFR5cGUuY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCB0YXJnZXRBc3QsIGJvb2xlYW4gcGFyZW50ZWQpIHsKLQkJCQlTaW1wbGVUeXBlIHJlc3VsdCA9IHRhcmdldEFzdC5uZXdTaW1wbGVUeXBlKAotCQkJCQl0YXJnZXRBc3QubmV3U2ltcGxlTmFtZSgiYSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYXJlbnRlZCkgewotCQkJCQl0YXJnZXRBc3QubmV3QXJyYXlUeXBlKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQlwdWJsaWMgQVNUTm9kZSBnZXQoKSB7Ci0JCQkJcmV0dXJuIHguZ2V0VHlwZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KEFTVE5vZGUgdmFsdWUpIHsKLQkJCQl4LnNldFR5cGUoKFR5cGUpIHZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlnZW5lcmljUHJvcGVydHlUZXN0KHgsIG5ldyBQcm9wZXJ0eSgiRXhwcmVzc2lvbiIsIHRydWUsIEV4cHJlc3Npb24uY2xhc3MpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIEFTVE5vZGUgc2FtcGxlKEFTVCBsb2NhbEFzdCwgYm9vbGVhbiBwYXJlbnRlZCkgewotCQkJCUV4cHJlc3Npb24gcmVzdWx0ID0gbG9jYWxBc3QubmV3U2ltcGxlTmFtZSgiZm9vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocGFyZW50ZWQpIHsKLQkJCQkJbG9jYWxBc3QubmV3RXhwcmVzc2lvblN0YXRlbWVudChyZXN1bHQpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgd3JhcCgpIHsKLQkJCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBzMSA9IGFzdC5uZXdQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oeCk7Ci0JCQkJcmV0dXJuIHMxOwotCQkJfQotCQkJcHVibGljIHZvaWQgdW53cmFwKCkgewotCQkJCVBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHMxID0gKFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKSB4LmdldFBhcmVudCgpOwotCQkJCXMxLnNldEV4cHJlc3Npb24oYXN0Lm5ld1NpbXBsZU5hbWUoImZpZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHVibGljIEFTVE5vZGUgZ2V0KCkgewotCQkJCXJldHVybiB4LmdldEV4cHJlc3Npb24oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChBU1ROb2RlIHZhbHVlKSB7Ci0JCQkJeC5zZXRFeHByZXNzaW9uKChFeHByZXNzaW9uKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQogCXB1YmxpYyB2b2lkIHRlc3RQcmVmaXhFeHByZXNzaW9uKCkgewogCQlsb25nIHByZXZpb3VzQ291bnQgPSBhc3QubW9kaWZpY2F0aW9uQ291bnQoKTsKIAkJZmluYWwgUHJlZml4RXhwcmVzc2lvbiB4ID0gYXN0Lm5ld1ByZWZpeEV4cHJlc3Npb24oKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0FTVFZpc2l0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9BU1RWaXNpdG9yVGVzdC5qYXZhCmluZGV4IDc2MWQ4YjguLjYzZmU2MjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0FTVFZpc2l0b3JUZXN0LmphdmEKKysrIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQVNUVmlzaXRvclRlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMywxMyArMjMsMTEgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5BcnJheUNyZWF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQXJyYXlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFzc2VydFN0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Bc3NpZ25tZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkJsb2NrOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkJsb2NrQ29tbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5CcmVha1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5DYXN0RXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5DYXRjaENsYXVzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5DaGFyYWN0ZXJMaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkNsYXNzSW5zdGFuY2VDcmVhdGlvbjsKQEAgLTYzLDcgKzYxLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5OdWxsTGl0ZXJhbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5QYXJhbWV0ZXJpemVkVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5QYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Qb3N0Zml4RXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5QcmVmaXhFeHByZXNzaW9uOwpAQCAtOTAsMTIgKzg3LDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvblN0YXRlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5UeXBlUGFyYW1ldGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLldoaWxlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLldpbGRjYXJkVHlwZTsKIAogcHVibGljIGNsYXNzIEFTVFZpc2l0b3JUZXN0IGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5qdW5pdC5leHRlbnNpb24uVGVzdENhc2UgeyAKIApAQCAtMTMyLDcgKzEyNyw2IEBACiAJU3RyaW5nIFQxUzsKIAlUeXBlIFQyOwogCVN0cmluZyBUMlM7Ci0JUGFyYW1ldGVyaXplZFR5cGUgUFQxOwogCVN0cmluZyBQVDFTOwogCVN0YXRlbWVudCBTMTsKIAlTdHJpbmcgUzFTOwpAQCAtMTgwLDkgKzE3NCw3IEBACiAJU3RyaW5nIEJDMVM7CiAJQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBBQ0QxOwogCVN0cmluZyBBQ0QxUzsKLQlUeXBlUGFyYW1ldGVyIFRQMTsKIAlTdHJpbmcgVFAxUzsKLQlUeXBlUGFyYW1ldGVyIFRQMjsKIAlTdHJpbmcgVFAyUzsKIAlTdHJpbmcgTVZQMVM7CiAJU3RyaW5nIE1WUDJTOwpAQCAtMzEyLDE1ICszMDQsMTAgQEAKIAkJTVBBUk0xUyA9ICJbKE1QQVJNWyh0UGNoYXJjaGFydFApXU1QQVJNKV0iOyAgLy8kTk9OLU5MUy0xJAogCiAJCWlmIChhc3QuYXBpTGV2ZWwoKSA+PSBBU1QuSkxTMykgewotCQkJUFQxID0gYXN0Lm5ld1BhcmFtZXRlcml6ZWRUeXBlKGFzdC5uZXdTaW1wbGVUeXBlKGFzdC5uZXdTaW1wbGVOYW1lKCJaIikpKTsgLy8kTk9OLU5MUy0xJAogCQkJUFQxUyA9ICJbKHRNWyh0U1soblNaWm5TKV10UylddE0pXSI7IC8vJE5PTi1OTFMtMSQKIAotCQkJVFAxID0gYXN0Lm5ld1R5cGVQYXJhbWV0ZXIoKTsKLQkJCVRQMS5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJ4IikpOyAvLyROT04tTkxTLTEkCiAJCQlUUDFTID0gIlsodFRQWyhuU3h4blMpXXRUUCldIjsgLy8kTk9OLU5MUy0xJAogCi0JCQlUUDIgPSBhc3QubmV3VHlwZVBhcmFtZXRlcigpOwotCQkJVFAyLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoInkiKSk7IC8vJE5PTi1OTFMtMSQKIAkJCVRQMlMgPSAiWyh0VFBbKG5TeXluUylddFRQKV0iOyAvLyROT04tTkxTLTEkCiAKIAkJCkBAIC00MTksMTMgKzQwNiw2IEBACiAJCQliLmFwcGVuZChub2RlLmdldFByaW1pdGl2ZVR5cGVDb2RlKCkudG9TdHJpbmcoKSk7CiAJCQliLmFwcGVuZCgidFApIik7IC8vJE5PTi1OTFMtMSQKIAkJfQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQYXJhbWV0ZXJpemVkVHlwZSBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKHRNIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQYXJhbWV0ZXJpemVkVHlwZSBub2RlKSB7Ci0JCQliLmFwcGVuZCgidE0pIik7IC8vJE5PTi1OTFMtMSQKLQkJfQogCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChRdWFsaWZpZWRUeXBlIG5vZGUpIHsKIAkJCWIuYXBwZW5kKCIodFEiKTsgLy8kTk9OLU5MUy0xJAogCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwpAQCAtNDMzLDEzICs0MTMsNiBAQAogCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChRdWFsaWZpZWRUeXBlIG5vZGUpIHsKIAkJCWIuYXBwZW5kKCJ0USkiKTsgLy8kTk9OLU5MUy0xJAogCQl9Ci0JCXB1YmxpYyBib29sZWFuIHZpc2l0KFdpbGRjYXJkVHlwZSBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKHRXIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBpc1Zpc2l0aW5nQ2hpbGRyZW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChXaWxkY2FyZFR5cGUgbm9kZSkgewotCQkJYi5hcHBlbmQoInRXKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KIAkJCiAJCS8vIEVYUFJFU1NJT05TIGFuZCBTVEFURU1FTlRTCiAKQEAgLTQ2OCwxNCArNDQxLDYgQEAKIAkJCWIuYXBwZW5kKCJlQUkpIik7IC8vJE5PTi1OTFMtMSQKIAkJfQogCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KEFzc2VydFN0YXRlbWVudCBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKHNBUyIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoQXNzZXJ0U3RhdGVtZW50IG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJzQVMpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCiAJCXB1YmxpYyBib29sZWFuIHZpc2l0KEFzc2lnbm1lbnQgbm9kZSkgewogCQkJYi5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAogCQkJYi5hcHBlbmQobm9kZS5nZXRPcGVyYXRvcigpLnRvU3RyaW5nKCkpOwpAQCAtNTEyLDE0ICs0NzcsNiBAQAogCQkJYi5hcHBlbmQoInNCUikiKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQkJYi5hcHBlbmQoIihlQ1MiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQkJCWIuYXBwZW5kKCJlQ1MpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCiAJCXB1YmxpYyBib29sZWFuIHZpc2l0KENhdGNoQ2xhdXNlIG5vZGUpIHsKIAkJCWIuYXBwZW5kKCIoY2MiKTsgLy8kTk9OLU5MUy0xJAogCQkJcmV0dXJuIGlzVmlzaXRpbmdDaGlsZHJlbigpOwpAQCAtOTYyLDE0ICs5MTksNiBAQAogCQkJYi5hcHBlbmQoImVUTCkiKTsgLy8kTk9OLU5MUy0xJAogCQl9CiAKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZVBhcmFtZXRlciBub2RlKSB7Ci0JCQliLmFwcGVuZCgiKHRUUCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZVBhcmFtZXRlciBub2RlKSB7Ci0JCQliLmFwcGVuZCgidFRQKSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQogCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbiBub2RlKSB7CiAJCQliLmFwcGVuZCgiKGVWRCIpOyAvLyROT04tTkxTLTEkCiAJCQlyZXR1cm4gaXNWaXNpdGluZ0NoaWxkcmVuKCk7CkBAIC0xMDcyLDIxICsxMDIxLDYgQEAKIAl9CiAKIAkvKiogQGRlcHJlY2F0ZWQgdXNpbmcgZGVwcmVjYXRlZCBjb2RlICovCi0JcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlcml6ZWRUeXBlKCkgewotCQlpZiAoYXN0LmFwaUxldmVsKCkgPT0gQVNULkpMUzIpIHsKLQkJCXJldHVybjsKLQkJfQotCQlQYXJhbWV0ZXJpemVkVHlwZSB4MSA9IGFzdC5uZXdQYXJhbWV0ZXJpemVkVHlwZShUMSk7Ci0JCXgxLnR5cGVBcmd1bWVudHMoKS5hZGQoVDIpOwotCQl4MS50eXBlQXJndW1lbnRzKCkuYWRkKFBUMSk7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsodE0iK1QxUytUMlMrUFQxUysidE0pXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoqIEBkZXByZWNhdGVkIHVzaW5nIGRlcHJlY2F0ZWQgY29kZSAqLwogCXB1YmxpYyB2b2lkIHRlc3RRdWFsaWZpZWRUeXBlKCkgewogCQlpZiAoYXN0LmFwaUxldmVsKCkgPT0gQVNULkpMUzIpIHsKIAkJCXJldHVybjsKQEAgLTEwOTgsMjAgKzEwMzIsNiBAQAogCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwogCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsodFEiK1QxUytOMVMrInRRKV0iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0KLQotCS8qKiBAZGVwcmVjYXRlZCB1c2luZyBkZXByZWNhdGVkIGNvZGUgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2lsZGNhcmRUeXBlKCkgewotCQlpZiAoYXN0LmFwaUxldmVsKCkgPT0gQVNULkpMUzIpIHsKLQkJCXJldHVybjsKLQkJfQotCQlXaWxkY2FyZFR5cGUgeDEgPSBhc3QubmV3V2lsZGNhcmRUeXBlKCk7Ci0JCXgxLnNldEJvdW5kKFQxLCB0cnVlKTsKLQkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKLQkJYi5zZXRMZW5ndGgoMCk7Ci0JCXgxLmFjY2VwdCh2MSk7Ci0JCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyh0VyIrVDFTKyJ0VyldIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9CiAJCiAJLy8gRVhQUkVTU0lPTlMgYW5kIFNUQVRFTUVOVFMKIApAQCAtMTE0OCwxNiArMTA2OCw2IEBACiAJCVN0cmluZyByZXN1bHQgPSBiLnRvU3RyaW5nKCk7CiAJCWFzc2VydFRydWUocmVzdWx0LmVxdWFscygiWyhlQUkiK0UxUytFMlMrImVBSSldIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAl9Ci0JcHVibGljIHZvaWQgdGVzdEFzc2VydFN0YXRlbWVudCgpIHsKLQkJQXNzZXJ0U3RhdGVtZW50IHgxID0gYXN0Lm5ld0Fzc2VydFN0YXRlbWVudCgpOwotCQl4MS5zZXRFeHByZXNzaW9uKEUxKTsKLQkJeDEuc2V0TWVzc2FnZShFMik7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoc0FTIitFMVMrRTJTKyJzQVMpXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQogCXB1YmxpYyB2b2lkIHRlc3RBc3NpZ25tZW50KCkgewogCQlBc3NpZ25tZW50IHgxID0gYXN0Lm5ld0Fzc2lnbm1lbnQoKTsKIAkJeDEuc2V0TGVmdEhhbmRTaWRlKEUxKTsKQEAgLTEyMTIsMTYgKzExMjIsNiBAQAogCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwogCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoc0JSIitOMVMrInNCUildIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAl9Ci0JcHVibGljIHZvaWQgdGVzdENhc3RFeHByZXNzaW9uKCkgewotCQlDYXN0RXhwcmVzc2lvbiB4MSA9IGFzdC5uZXdDYXN0RXhwcmVzc2lvbigpOwotCQl4MS5zZXRUeXBlKFQxKTsKLQkJeDEuc2V0RXhwcmVzc2lvbihFMSk7Ci0JCVRlc3RWaXNpdG9yIHYxID0gbmV3IFRlc3RWaXNpdG9yKCk7Ci0JCWIuc2V0TGVuZ3RoKDApOwotCQl4MS5hY2NlcHQodjEpOwotCQlTdHJpbmcgcmVzdWx0ID0gYi50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5lcXVhbHMoIlsoZUNTIitUMVMrRTFTKyJlQ1MpXSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQogCXB1YmxpYyB2b2lkIHRlc3RDYXRjaENsYXVzZSgpIHsKIAkJQ2F0Y2hDbGF1c2UgeDEgPSBhc3QubmV3Q2F0Y2hDbGF1c2UoKTsKIAkJeDEuc2V0RXhjZXB0aW9uKFYxKTsKQEAgLTEyNDgsNyArMTE0OCw2IEBACiAJCWlmIChhc3QuYXBpTGV2ZWwoKSA9PSBBU1QuSkxTMikgewogCQkJeDEuc2V0TmFtZShOMSk7CiAJCX0gZWxzZSB7Ci0JCQl4MS50eXBlQXJndW1lbnRzKCkuYWRkKFBUMSk7CiAJCQl4MS5zZXRUeXBlKFQxKTsKIAkJfQogCQl4MS5zZXRBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uKEFDRDEpOwpAQCAtMTMwNiw5ICsxMjA1LDYgQEAKIAkvKiogQGRlcHJlY2F0ZWQgdXNpbmcgZGVwcmVjYXRlZCBjb2RlICovCiAJcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9ySW52b2NhdGlvbigpIHsKIAkJQ29uc3RydWN0b3JJbnZvY2F0aW9uIHgxID0gYXN0Lm5ld0NvbnN0cnVjdG9ySW52b2NhdGlvbigpOwotCQlpZiAoYXN0LmFwaUxldmVsKCkgPj0gQVNULkpMUzMpIHsKLQkJCXgxLnR5cGVBcmd1bWVudHMoKS5hZGQoUFQxKTsKLQkJfQogCQl4MS5hcmd1bWVudHMoKS5hZGQoRTEpOwogCQl4MS5hcmd1bWVudHMoKS5hZGQoRTIpOwogCQlUZXN0VmlzaXRvciB2MSA9IG5ldyBUZXN0VmlzaXRvcigpOwpAQCAtMTU1NSw3ICsxNDUxLDYgQEAKIAkJfSBlbHNlIHsKIAkJCXgxLm1vZGlmaWVycygpLmFkZChNT0QxKTsKIAkJCXgxLm1vZGlmaWVycygpLmFkZChNT0QyKTsKLQkJCXgxLnR5cGVQYXJhbWV0ZXJzKCkuYWRkKFRQMSk7CiAJCQl4MS5zZXRSZXR1cm5UeXBlMihUMSk7CiAJCX0KIAkJeDEuc2V0TmFtZShOMSk7CkBAIC0xNTc4LDkgKzE0NzMsNiBAQAogCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJbnZvY2F0aW9uKCkgewogCQlGdW5jdGlvbkludm9jYXRpb24geDEgPSBhc3QubmV3RnVuY3Rpb25JbnZvY2F0aW9uKCk7CiAJCXgxLnNldEV4cHJlc3Npb24oTjEpOwotCQlpZiAoYXN0LmFwaUxldmVsKCkgPj0gQVNULkpMUzMpIHsKLQkJCXgxLnR5cGVBcmd1bWVudHMoKS5hZGQoUFQxKTsKLQkJfQogCQl4MS5zZXROYW1lKE4yKTsKIAkJeDEuYXJndW1lbnRzKCkuYWRkKEUxKTsKIAkJeDEuYXJndW1lbnRzKCkuYWRkKEUyKTsKQEAgLTE2OTgsOSArMTU5MCw2IEBACiAJcHVibGljIHZvaWQgdGVzdFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uKCkgewogCQlTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiB4MSA9IGFzdC5uZXdTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbigpOwogCQl4MS5zZXRFeHByZXNzaW9uKE4xKTsKLQkJaWYgKGFzdC5hcGlMZXZlbCgpID49IEFTVC5KTFMzKSB7Ci0JCQl4MS50eXBlQXJndW1lbnRzKCkuYWRkKFBUMSk7Ci0JCX0KIAkJeDEuYXJndW1lbnRzKCkuYWRkKEUxKTsKIAkJeDEuYXJndW1lbnRzKCkuYWRkKEUyKTsKIAkJVGVzdFZpc2l0b3IgdjEgPSBuZXcgVGVzdFZpc2l0b3IoKTsKQEAgLTE3MjcsOSArMTYxNiw2IEBACiAJcHVibGljIHZvaWQgdGVzdFN1cGVyTWV0aG9kSW52b2NhdGlvbigpIHsKIAkJU3VwZXJNZXRob2RJbnZvY2F0aW9uIHgxID0gYXN0Lm5ld1N1cGVyTWV0aG9kSW52b2NhdGlvbigpOwogCQl4MS5zZXRRdWFsaWZpZXIoTjEpOwotCQlpZiAoYXN0LmFwaUxldmVsKCkgPj0gQVNULkpMUzMpIHsKLQkJCXgxLnR5cGVBcmd1bWVudHMoKS5hZGQoUFQxKTsKLQkJfQogCQl4MS5zZXROYW1lKE4yKTsKIAkJeDEuYXJndW1lbnRzKCkuYWRkKEUxKTsKIAkJeDEuYXJndW1lbnRzKCkuYWRkKEUyKTsKQEAgLTE4MzMsOCArMTcxOSw2IEBACiAJCX0gZWxzZSB7CiAJCQl4MS5tb2RpZmllcnMoKS5hZGQoTU9EMSk7CiAJCQl4MS5tb2RpZmllcnMoKS5hZGQoTU9EMik7Ci0JCQl4MS50eXBlUGFyYW1ldGVycygpLmFkZChUUDEpOwotCQkJeDEuc2V0U3VwZXJjbGFzc1R5cGUoUFQxKTsKIAkJCXgxLnN1cGVySW50ZXJmYWNlVHlwZXMoKS5hZGQoVDEpOwogCQkJeDEuc3VwZXJJbnRlcmZhY2VUeXBlcygpLmFkZChUMik7IC8vJE5PTi1OTFMtMSQKIAkJfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQmF0Y2hBU1RDcmVhdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9CYXRjaEFTVENyZWF0aW9uVGVzdHMuamF2YQppbmRleCAzNWM3NGU1Li4xNDZlNzM2IDEwMDY0NAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9CYXRjaEFTVENyZWF0aW9uVGVzdHMuamF2YQorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9CYXRjaEFTVENyZWF0aW9uVGVzdHMuamF2YQpAQCAtMTg4OCwzNSArMTg4OCw3IEBACiAJCWRlbGV0ZVByb2plY3QocHJvamVjdE5hbWUpOwogCX0KIH0KLS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMTUyOQotcHVibGljIHZvaWQgdGVzdDA4MSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JZmluYWwgU3RyaW5nIHByb2plY3ROYW1lID0gIlAwODEiOwotCXRyeSB7Ci0JCUlKYXZhU2NyaXB0UHJvamVjdCBqYXZhUHJvamVjdCA9IGNyZWF0ZUphdmFQcm9qZWN0KHByb2plY3ROYW1lLCBuZXcgU3RyaW5nW10geyJzcmMifSwgVXRpbC5nZXRKYXZhQ2xhc3NMaWJzKCksICJiaW4iLCAiMS41Iik7Ci0JCVN0cmluZyB0eXBlTmFtZSA9ICJqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuSW50ZWdlcj4iOwotCQljbGFzcyBCaW5kaW5nUmVxdWVzdG9yIGV4dGVuZHMgQVNUUmVxdWVzdG9yIHsKLQkJCUlUeXBlQmluZGluZyBfcmVzdWx0ID0gbnVsbDsKLQkJCXB1YmxpYyB2b2lkIGFjY2VwdEJpbmRpbmcoU3RyaW5nIGJpbmRpbmdLZXksIElCaW5kaW5nIGJpbmRpbmcpIHsKLQkJCQlpZiAoX3Jlc3VsdCA9PSBudWxsICYmIGJpbmRpbmcgIT0gbnVsbCAmJiBiaW5kaW5nLmdldEtpbmQoKSA9PSBJQmluZGluZy5UWVBFKQotCQkJCQlfcmVzdWx0ID0gKElUeXBlQmluZGluZykgYmluZGluZzsKLQkJCX0KLQkJfQotCQlTdHJpbmdbXSBrZXlzID0gbmV3IFN0cmluZ1tdIHsKLQkJCUJpbmRpbmdLZXkuY3JlYXRlVHlwZUJpbmRpbmdLZXkodHlwZU5hbWUpCi0JCX07Ci0JCWZpbmFsIEJpbmRpbmdSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEJpbmRpbmdSZXF1ZXN0b3IoKTsKLQkJZmluYWwgQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOwotCQlwYXJzZXIuc2V0UmVzb2x2ZUJpbmRpbmdzKHRydWUpOwotCQlwYXJzZXIuc2V0UHJvamVjdChqYXZhUHJvamVjdCk7Ci0JCS8vIHRoaXMgZG9lc26SdCByZWFsbHkgZG8gYSBwYXJzZTsgaXSScyBhIHR5cGUgbG9va3VwCi0JCXBhcnNlci5jcmVhdGVBU1RzKG5ldyBJSmF2YVNjcmlwdFVuaXRbXSB7fSwga2V5cywgcmVxdWVzdG9yLCBudWxsKTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gcmVxdWVzdG9yLl9yZXN1bHQ7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGJpbmRpbmciLCB0eXBlQmluZGluZyk7Ci0JCWFzc2VydFRydWUoIk5vdCBhIHBhcmFtZXRlcml6ZWQgdHlwZSBiaW5kaW5nIiwgdHlwZUJpbmRpbmcuaXNQYXJhbWV0ZXJpemVkVHlwZSgpKTsKLQl9IGZpbmFsbHkgewotCQlkZWxldGVQcm9qZWN0KHByb2plY3ROYW1lKTsKLQl9Ci19CisKIC8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMTUyOQogcHVibGljIHZvaWQgdGVzdDA4MigpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJZmluYWwgU3RyaW5nIHByb2plY3ROYW1lID0gIlAwODIiOwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vQmluZGluZ3NDb2xsZWN0b3JWaXNpdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9CaW5kaW5nc0NvbGxlY3RvclZpc2l0b3IuamF2YQppbmRleCA2NmUyMDlmLi5iNDQyNmQwIDEwMDY0NAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9CaW5kaW5nc0NvbGxlY3RvclZpc2l0b3IuamF2YQorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9CaW5kaW5nc0NvbGxlY3RvclZpc2l0b3IuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0yMiw3ICsyMiw2IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQXJyYXlUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFzc2lnbm1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ2FzdEV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ2hhcmFjdGVyTGl0ZXJhbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5DbGFzc0luc3RhbmNlQ3JlYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ29uZGl0aW9uYWxFeHByZXNzaW9uOwpAQCAtNDQsNyArNDMsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLk51bGxMaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlBhcmFtZXRlcml6ZWRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlBvc3RmaXhFeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlByZWZpeEV4cHJlc3Npb247CkBAIC0xNTAsMTQgKzE0OCw2IEBACiAJfQogCiAJLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5BU1RWaXNpdG9yI2VuZFZpc2l0KENhc3RFeHByZXNzaW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbm9kZS5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJY29sbGVjdEJpbmRpbmdzKG5vZGUsIHR5cGVCaW5kaW5nKTsKLQl9Ci0KLQkvKioKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoQ2hhcmFjdGVyTGl0ZXJhbCkKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKQEAgLTI4NSwxNSArMjc1LDYgQEAKIAl9CiAKIAkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFTVFZpc2l0b3IjZW5kVmlzaXQoUGFyYW1ldGVyaXplZFR5cGUpCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBhcmFtZXRlcml6ZWRUeXBlIG5vZGUpIHsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gbm9kZS5yZXNvbHZlQmluZGluZygpOwotCQljb2xsZWN0QmluZGluZ3Mobm9kZSwgdHlwZUJpbmRpbmcpOwotCX0KLQotCS8qKgogCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQVNUVmlzaXRvciNlbmRWaXNpdChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbikKIAkgKi8KIAlwdWJsaWMgdm9pZCBlbmRWaXNpdChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9Db252ZXJ0ZXJUZXN0U2V0dXAuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0NvbnZlcnRlclRlc3RTZXR1cC5qYXZhCmluZGV4IDc1MDA2NWMuLjM0NjUwZmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0NvbnZlcnRlclRlc3RTZXR1cC5qYXZhCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL0NvbnZlcnRlclRlc3RTZXR1cC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM2LDcgKzM2LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5CbG9jazsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ2FzdEV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ2hhcmFjdGVyTGl0ZXJhbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5DbGFzc0luc3RhbmNlQ3JlYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQ29uZGl0aW9uYWxFeHByZXNzaW9uOwpAQCAtNTQsNyArNTMsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLk51bGxMaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlBhcmFtZXRlcml6ZWRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlBvc3RmaXhFeHByZXNzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlByZWZpeEV4cHJlc3Npb247CkBAIC03MSwxMCArNjksOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uVHlwZUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uVHlwZVBhcmFtZXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uV2lsZGNhcmRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMudXRpbC5VdGlsOwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udmVydGVyVGVzdFNldHVwIGV4dGVuZHMgQWJzdHJhY3RBU1RUZXN0cyB7CkBAIC0xOTksMTEgKzE5NSw2IEBACiAJCQlzdXBlci5lbmRWaXNpdChub2RlKTsKIAkJfQogCi0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENhc3RFeHByZXNzaW9uIG5vZGUpIHsKLQkJCWFzc2VydE5vdE51bGwobm9kZSsiIHNob3VsZCBoYXZlIGEgYmluZGluZyIsIG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCkpOwotCQkJc3VwZXIuZW5kVmlzaXQobm9kZSk7Ci0JCX0KLQogCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKIAkJCWFzc2VydE5vdE51bGwobm9kZSsiIHNob3VsZCBoYXZlIGEgYmluZGluZyIsIG5vZGUucmVzb2x2ZVR5cGVCaW5kaW5nKCkpOwogCQkJc3VwZXIuZW5kVmlzaXQobm9kZSk7CkBAIC0zMjksMTEgKzMyMCw2IEBACiAJCQlzdXBlci5lbmRWaXNpdChub2RlKTsKIAkJfQogCi0JCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBhcmFtZXRlcml6ZWRUeXBlIG5vZGUpIHsKLQkJCWFzc2VydE5vdE51bGwobm9kZSsiIHNob3VsZCBoYXZlIGEgYmluZGluZyIsIG5vZGUucmVzb2x2ZUJpbmRpbmcoKSk7Ci0JCQlzdXBlci5lbmRWaXNpdChub2RlKTsKLQkJfQotCiAJCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFByaW1pdGl2ZVR5cGUgbm9kZSkgewogCQkJYXNzZXJ0Tm90TnVsbChub2RlKyIgc2hvdWxkIGhhdmUgYSBiaW5kaW5nIiwgbm9kZS5yZXNvbHZlQmluZGluZygpKTsKIAkJCXN1cGVyLmVuZFZpc2l0KG5vZGUpOwpAQCAtMzc0LDIxICszNjAsMTEgQEAKIAkJCXN1cGVyLmVuZFZpc2l0KG5vZGUpOwogCQl9CiAKLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZVBhcmFtZXRlciBub2RlKSB7Ci0JCQlhc3NlcnROb3ROdWxsKG5vZGUrIiBzaG91bGQgaGF2ZSBhIGJpbmRpbmciLCBub2RlLnJlc29sdmVCaW5kaW5nKCkpOwotCQkJc3VwZXIuZW5kVmlzaXQobm9kZSk7Ci0JCX0KLQogCQlwdWJsaWMgdm9pZCBlbmRWaXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgbm9kZSkgewogCQkJYXNzZXJ0Tm90TnVsbChub2RlKyIgc2hvdWxkIGhhdmUgYSBiaW5kaW5nIiwgbm9kZS5yZXNvbHZlQmluZGluZygpKTsKIAkJCXN1cGVyLmVuZFZpc2l0KG5vZGUpOwogCQl9CiAKLQkJcHVibGljIHZvaWQgZW5kVmlzaXQoV2lsZGNhcmRUeXBlIG5vZGUpIHsKLQkJCWFzc2VydE5vdE51bGwobm9kZSsiIHNob3VsZCBoYXZlIGEgYmluZGluZyIsIG5vZGUucmVzb2x2ZUJpbmRpbmcoKSk7Ci0JCQlzdXBlci5lbmRWaXNpdChub2RlKTsKLQkJfQotCiAJfQogCXB1YmxpYyBBU1ROb2RlIHJ1bkpMUzNDb252ZXJzaW9uKElKYXZhU2NyaXB0VW5pdCB1bml0LCBib29sZWFuIHJlc29sdmVCaW5kaW5ncywgYm9vbGVhbiBjaGVja0pMUzIpIHsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vU2FtcGxlQVNUcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9kb20vU2FtcGxlQVNUcy5qYXZhCmluZGV4IGExMmU3OWMuLjYzZTdiZWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvZG9tL1NhbXBsZUFTVHMuamF2YQorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL2RvbS9TYW1wbGVBU1RzLmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjAsMTIgKzIwLDEwIEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQXJyYXlDcmVhdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkFycmF5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Bc3NlcnRTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uQXNzaWdubWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5CbG9jazsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5CcmVha1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5DYXN0RXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5DYXRjaENsYXVzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5DaGFyYWN0ZXJMaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLkNsYXNzSW5zdGFuY2VDcmVhdGlvbjsKQEAgLTU0LDcgKzUyLDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5OdWxsTGl0ZXJhbDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5QYXJhbWV0ZXJpemVkVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5QYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5Qb3N0Zml4RXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5QcmVmaXhFeHByZXNzaW9uOwpAQCAtODIsNyArNzksNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLldoaWxlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLldpbGRjYXJkVHlwZTsKIAogcHVibGljIGNsYXNzIFNhbXBsZUFTVHMgewogCS8qKgpAQCAtMTM2LDE5ICsxMzIsMTIgQEAKIAkJaWYgKHRhcmdldC5hcGlMZXZlbCgpID49IEFTVC5KTFMzKSB7CiAJCQlTaW1wbGVUeXBlIHN0ID0gdGFyZ2V0Lm5ld1NpbXBsZVR5cGUocW4pOwogCQkJUXVhbGlmaWVkVHlwZSBxdCA9IHRhcmdldC5uZXdRdWFsaWZpZWRUeXBlKHN0LCB0YXJnZXQubmV3U2ltcGxlTmFtZSgieCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJV2lsZGNhcmRUeXBlIHd0ID0gdGFyZ2V0Lm5ld1dpbGRjYXJkVHlwZSgpOwotCQkJUGFyYW1ldGVyaXplZFR5cGUgcG10ID0gdGFyZ2V0Lm5ld1BhcmFtZXRlcml6ZWRUeXBlKHRhcmdldC5uZXdTaW1wbGVUeXBlKHRhcmdldC5uZXdTaW1wbGVOYW1lKCJ5IikpKTsgLy8kTk9OLU5MUy0xJAotCQkJcG10LnR5cGVBcmd1bWVudHMoKS5hZGQod3QpOwotCQkJcG10LnR5cGVBcmd1bWVudHMoKS5hZGQocXQpOwotCQkJbWQuc2V0UmV0dXJuVHlwZTIocG10KTsKIAkJfQogCQkKIAkJQmxvY2sgYiA9IHRhcmdldC5uZXdCbG9jaygpOwogCQltZC5zZXRCb2R5KGIpOwogCQkKIAkJLy8gYWxsIHN0YXRlbWVudHMgKGluIGFscGhhYmV0aWMgb3JkZXIgb2Ygc3RhdGVtZW50IHR5cGUpCi0JCUFzc2VydFN0YXRlbWVudCBhc3NlcnRTdGF0ZW1lbnQgPSB0YXJnZXQubmV3QXNzZXJ0U3RhdGVtZW50KCk7Ci0JCWIuc3RhdGVtZW50cygpLmFkZChhc3NlcnRTdGF0ZW1lbnQpOwogCQlCbG9jayBibG9jayA9IHRhcmdldC5uZXdCbG9jaygpOwogCQliLnN0YXRlbWVudHMoKS5hZGQoYmxvY2spOwogCQlCcmVha1N0YXRlbWVudCBicmVha1N0YXRlbWVudCA9IHRhcmdldC5uZXdCcmVha1N0YXRlbWVudCgpOwpAQCAtMjE3LDggKzIwNiw2IEBACiAJCXouYWRkKGFzc2lnbm1lbnQpOwogCQlCb29sZWFuTGl0ZXJhbCBib29sZWFuTGl0ZXJhbCA9IHRhcmdldC5uZXdCb29sZWFuTGl0ZXJhbCh0cnVlKTsKIAkJei5hZGQoYm9vbGVhbkxpdGVyYWwpOwotCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbiA9IHRhcmdldC5uZXdDYXN0RXhwcmVzc2lvbigpOwotCQl6LmFkZChjYXN0RXhwcmVzc2lvbik7CiAJCUNoYXJhY3RlckxpdGVyYWwgY2hhcmFjdGVyTGl0ZXJhbCA9IHRhcmdldC5uZXdDaGFyYWN0ZXJMaXRlcmFsKCk7CiAJCXouYWRkKGNoYXJhY3RlckxpdGVyYWwpOwogCQlDbGFzc0luc3RhbmNlQ3JlYXRpb24gY2ljID0gdGFyZ2V0Lm5ld0NsYXNzSW5zdGFuY2VDcmVhdGlvbigpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nTWV0aG9kRGVjbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ01ldGhvZERlY2xUZXN0LmphdmEKaW5kZXggNDBkNTc3ZS4uYWIzY2U4NyAxMDA2NDQKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nTWV0aG9kRGVjbFRlc3QuamF2YQorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdNZXRob2REZWNsVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTM5LDcgKzM5LDYgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5UcnlTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uVHlwZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uVHlwZVBhcmFtZXRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20ucmV3cml0ZS5BU1RSZXdyaXRlOwpAQCAtMTgyLDYyICsxODEsNiBAQAogCQkJCiAJCWFzc2VydEVxdWFsU3RyaW5nKHByZXZpZXcsIGJ1Zi50b1N0cmluZygpKTsKIAl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kVHlwZVBhcmFtZXRlckFkZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrMT0gdGhpcy5zb3VyY2VGb2xkZXIuY3JlYXRlUGFja2FnZUZyYWdtZW50KCJ0ZXN0MSIsIGZhbHNlLCBudWxsKTsKLQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJwYWNrYWdlIHRlc3QxO1xuIik7Ci0JCWJ1Zi5hcHBlbmQoInB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFIHtcbiIpOwotCQlidWYuYXBwZW5kKCIgICAgLyoqXG4iKTsKLQkJYnVmLmFwcGVuZCgiICAgICAqXG4iKTsKLQkJYnVmLmFwcGVuZCgiICAgICAqL1xuIik7Ci0JCWJ1Zi5hcHBlbmQoIiAgICBFKGludCBwMSkge31cbiIpOwotCQlidWYuYXBwZW5kKCIgICAgRShpbnQgcDEsIGludCBwMikge31cbiIpOwotCQlidWYuYXBwZW5kKCIgICAgcHVibGljIEUoaW50IHAxLCBieXRlIHAyKSB7fVxuIik7Ci0JCWJ1Zi5hcHBlbmQoIiAgICAvKipcbiIpOwotCQlidWYuYXBwZW5kKCIgICAgICpcbiIpOwotCQlidWYuYXBwZW5kKCIgICAgICovXG4iKTsKLQkJYnVmLmFwcGVuZCgiICAgIHZvaWQgZ2VlKGludCBwMSkge31cbiIpOwotCQlidWYuYXBwZW5kKCIgICAgdm9pZCBoZWUoaW50IHAxLCBpbnQgcDIpIHt9XG4iKTsKLQkJYnVmLmFwcGVuZCgiICAgIHB1YmxpYyB2b2lkIGhlZShpbnQgcDEsIGJ5dGUgcDIpIHt9XG4iKTsKLQkJYnVmLmFwcGVuZCgifVxuIik7CQotCQlJSmF2YVNjcmlwdFVuaXQgY3U9IHBhY2sxLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiRS5qcyIsIGJ1Zi50b1N0cmluZygpLCBmYWxzZSwgbnVsbCk7CQotCQkKLQkJSmF2YVNjcmlwdFVuaXQgYXN0Um9vdD0gY3JlYXRlQVNUMyhjdSk7Ci0JCUFTVFJld3JpdGUgcmV3cml0ZT0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0Um9vdC5nZXRBU1QoKSk7Ci0JCUFTVCBhc3Q9IGFzdFJvb3QuZ2V0QVNUKCk7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlPSBmaW5kVHlwZURlY2xhcmF0aW9uKGFzdFJvb3QsICJFIik7Ci0JCQotCQlGdW5jdGlvbkRlY2xhcmF0aW9uW10gbWV0aG9kcz0gdHlwZS5nZXRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkKLQkJCS8vIGFkZCB0eXBlIHBhcmFtZXRlcgotCQkJRnVuY3Rpb25EZWNsYXJhdGlvbiBtZXRob2REZWNsPSBtZXRob2RzW2ldOwotCQkJTGlzdFJld3JpdGUgbGlzdFJld3JpdGU9IHJld3JpdGUuZ2V0TGlzdFJld3JpdGUobWV0aG9kRGVjbCwgRnVuY3Rpb25EZWNsYXJhdGlvbi5UWVBFX1BBUkFNRVRFUlNfUFJPUEVSVFkpOwotCQkJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyPSBhc3QubmV3VHlwZVBhcmFtZXRlcigpOwotCQkJdHlwZVBhcmFtZXRlci5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJYIikpOwotCQkJbGlzdFJld3JpdGUuaW5zZXJ0Rmlyc3QodHlwZVBhcmFtZXRlciwgbnVsbCk7Ci0JCX0JCQkJCQotCQlTdHJpbmcgcHJldmlldz0gZXZhbHVhdGVSZXdyaXRlKGN1LCByZXdyaXRlKTsKLQkJCi0JCWJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJwYWNrYWdlIHRlc3QxO1xuIik7Ci0JCWJ1Zi5hcHBlbmQoInB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFIHtcbiIpOwotCQlidWYuYXBwZW5kKCIgICAgLyoqXG4iKTsKLQkJYnVmLmFwcGVuZCgiICAgICAqXG4iKTsKLQkJYnVmLmFwcGVuZCgiICAgICAqL1xuIik7Ci0JCWJ1Zi5hcHBlbmQoIiAgICA8WD4gRShpbnQgcDEpIHt9XG4iKTsKLQkJYnVmLmFwcGVuZCgiICAgIDxYPiBFKGludCBwMSwgaW50IHAyKSB7fVxuIik7Ci0JCWJ1Zi5hcHBlbmQoIiAgICBwdWJsaWMgPFg+IEUoaW50IHAxLCBieXRlIHAyKSB7fVxuIik7Ci0JCWJ1Zi5hcHBlbmQoIiAgICAvKipcbiIpOwotCQlidWYuYXBwZW5kKCIgICAgICpcbiIpOwotCQlidWYuYXBwZW5kKCIgICAgICovXG4iKTsKLQkJYnVmLmFwcGVuZCgiICAgIDxYPiB2b2lkIGdlZShpbnQgcDEpIHt9XG4iKTsKLQkJYnVmLmFwcGVuZCgiICAgIDxYPiB2b2lkIGhlZShpbnQgcDEsIGludCBwMikge31cbiIpOwotCQlidWYuYXBwZW5kKCIgICAgcHVibGljIDxYPiB2b2lkIGhlZShpbnQgcDEsIGJ5dGUgcDIpIHt9XG4iKTsKLQkJYnVmLmFwcGVuZCgifVxuIik7CQkKLQkJYXNzZXJ0RXF1YWxTdHJpbmcocHJldmlldywgYnVmLnRvU3RyaW5nKCkpOwotCX0KIAkKIAlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kVHlwZVBhcmFtZXRlclJlbW92ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSVBhY2thZ2VGcmFnbWVudCBwYWNrMT0gdGhpcy5zb3VyY2VGb2xkZXIuY3JlYXRlUGFja2FnZUZyYWdtZW50KCJ0ZXN0MSIsIGZhbHNlLCBudWxsKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ01vdmVDb2RlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nTW92ZUNvZGVUZXN0LmphdmEKaW5kZXggNDNmZGJhOS4uZTg4N2JlMiAxMDA2NDQKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nTW92ZUNvZGVUZXN0LmphdmEKKysrIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nTW92ZUNvZGVUZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTg3MiwyMyArMTg3Miw3IEBACiAJCUphdmFTY3JpcHRVbml0IGFzdFJvb3Q9IGNyZWF0ZUFTVChjdSk7CiAJCUFTVCBhc3Q9IGFzdFJvb3QuZ2V0QVNUKCk7CiAJCUFTVFJld3JpdGUgcmV3cml0ZT0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0Um9vdC5nZXRBU1QoKSk7Ci0JCQotCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2w9IGZpbmRUeXBlRGVjbGFyYXRpb24oYXN0Um9vdCwgIkUiKTsKLQkJRnVuY3Rpb25EZWNsYXJhdGlvbiBtZXRoRGVjbD0gZmluZE1ldGhvZERlY2xhcmF0aW9uKHR5cGVEZWNsLCAiZm9vIik7Ci0JCVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgdmFyU3RhdD0gKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQpIG1ldGhEZWNsLmdldEJvZHkoKS5zdGF0ZW1lbnRzKCkuZ2V0KDApOwotCQkKLQkJQ2FzdEV4cHJlc3Npb24gZXhwcmVzc2lvbj0gKENhc3RFeHByZXNzaW9uKSAoKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCkgdmFyU3RhdC5mcmFnbWVudHMoKS5nZXQoMCkpLmdldEluaXRpYWxpemVyKCk7Ci0JCUZ1bmN0aW9uSW52b2NhdGlvbiBpbnZvY2F0aW9uPSAoRnVuY3Rpb25JbnZvY2F0aW9uKSBleHByZXNzaW9uLmdldEV4cHJlc3Npb24oKTsKLQkJCi0JCUNhc3RFeHByZXNzaW9uIG5ld0Nhc3Q9IGFzdC5uZXdDYXN0RXhwcmVzc2lvbigpOwotCQluZXdDYXN0LnNldFR5cGUoKFR5cGUpIHJld3JpdGUuY3JlYXRlQ29weVRhcmdldChleHByZXNzaW9uLmdldFR5cGUoKSkpOwotCQluZXdDYXN0LnNldEV4cHJlc3Npb24oKEV4cHJlc3Npb24pIHJld3JpdGUuY3JlYXRlQ29weVRhcmdldChpbnZvY2F0aW9uLmdldEV4cHJlc3Npb24oKSkpOwotCQlQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBwYXJlbnRzPSBhc3QubmV3UGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKLQkJcGFyZW50cy5zZXRFeHByZXNzaW9uKG5ld0Nhc3QpOwotCQkKLQkJQVNUTm9kZSBub2RlPSByZXdyaXRlLmNyZWF0ZUNvcHlUYXJnZXQoaW52b2NhdGlvbik7Ci0JCXJld3JpdGUucmVwbGFjZShleHByZXNzaW9uLCBub2RlLCBudWxsKTsKLQkJcmV3cml0ZS5yZXBsYWNlKGludm9jYXRpb24uZ2V0RXhwcmVzc2lvbigpLCBwYXJlbnRzLCBudWxsKTsKKwogCQkJCQogCQlTdHJpbmcgcHJldmlldz0gZXZhbHVhdGVSZXdyaXRlKGN1LCByZXdyaXRlKTsKIAkJCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdTdGF0ZW1lbnRzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nU3RhdGVtZW50c1Rlc3QuamF2YQppbmRleCA2NjgzYWQ0Li5lNTQwNmNjIDEwMDY0NAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdTdGF0ZW1lbnRzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ1N0YXRlbWVudHNUZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMjY5NSw4MCArMjY5NSw2IEBACiAKIAl9CiAJCi0JcHVibGljIHZvaWQgdGVzdEFzc2VydFN0YXRlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJUGFja2FnZUZyYWdtZW50IHBhY2sxPSB0aGlzLnNvdXJjZUZvbGRlci5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoInRlc3QxIiwgZmFsc2UsIG51bGwpOwotCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoInBhY2thZ2UgdGVzdDE7XG4iKTsKLQkJYnVmLmFwcGVuZCgicHVibGljIGNsYXNzIEUge1xuIik7Ci0JCWJ1Zi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iKTsKLQkJYnVmLmFwcGVuZCgiICAgICAgICBhc3NlcnQodHJ1ZSk7XG4iKTsKLQkJYnVmLmFwcGVuZCgiICAgICAgICBhc3NlcnQvKiBjb21tZW50Ki90cnVlO1xuIik7Ci0JCWJ1Zi5hcHBlbmQoIiAgICAgICAgYXNzZXJ0KHRydWUpO1xuIik7Ci0JCWJ1Zi5hcHBlbmQoIiAgICAgICAgYXNzZXJ0KHRydWUpIDogXCJIZWxsb1wiO1xuIik7Ci0JCWJ1Zi5hcHBlbmQoIiAgICAgICAgYXNzZXJ0KHRydWUpIDogXCJIZWxsb1wiO1xuIik7Ci0JCWJ1Zi5hcHBlbmQoIiAgICB9XG4iKTsKLQkJYnVmLmFwcGVuZCgifVxuIik7CQotCQlJSmF2YVNjcmlwdFVuaXQgY3U9IHBhY2sxLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiRS5qcyIsIGJ1Zi50b1N0cmluZygpLCBmYWxzZSwgbnVsbCk7Ci0JCQotCQlKYXZhU2NyaXB0VW5pdCBhc3RSb290PSBjcmVhdGVBU1QoY3UpOwotCQlBU1RSZXdyaXRlIHJld3JpdGU9IEFTVFJld3JpdGUuY3JlYXRlKGFzdFJvb3QuZ2V0QVNUKCkpOwotCQkKLQkJQVNUIGFzdD0gYXN0Um9vdC5nZXRBU1QoKTsKLQkJCi0JCWFzc2VydFRydWUoIlBhcnNlIGVycm9ycyIsIChhc3RSb290LmdldEZsYWdzKCkgJiBBU1ROb2RlLk1BTEZPUk1FRCkgPT0gMCk7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlPSBmaW5kVHlwZURlY2xhcmF0aW9uKGFzdFJvb3QsICJFIik7Ci0JCUZ1bmN0aW9uRGVjbGFyYXRpb24gbWV0aG9kRGVjbD0gZmluZE1ldGhvZERlY2xhcmF0aW9uKHR5cGUsICJmb28iKTsKLQkJQmxvY2sgYmxvY2s9IG1ldGhvZERlY2wuZ2V0Qm9keSgpOwotCQlMaXN0IHN0YXRlbWVudHM9IGJsb2NrLnN0YXRlbWVudHMoKTsKLQkJYXNzZXJ0VHJ1ZSgiTnVtYmVyIG9mIHN0YXRlbWVudHMgbm90IDUiLCBzdGF0ZW1lbnRzLnNpemUoKSA9PSA1KTsKLQkJeyAvLyByZXBsYWNlIGV4cHJlc3Npb24KLQkJCUFzc2VydFN0YXRlbWVudCBzdGF0ZW1lbnQ9IChBc3NlcnRTdGF0ZW1lbnQpIHN0YXRlbWVudHMuZ2V0KDApOwotCQkJCi0JCQlTaW1wbGVOYW1lIG5ld0V4cHJlc3Npb249IGFzdC5uZXdTaW1wbGVOYW1lKCJ4Iik7CQotCQkJcmV3cml0ZS5zZXQoc3RhdGVtZW50LCBBc3NlcnRTdGF0ZW1lbnQuRVhQUkVTU0lPTl9QUk9QRVJUWSwgbmV3RXhwcmVzc2lvbiwgbnVsbCk7Ci0JCX0KLQkJeyAvLyByZXBsYWNlIGV4cHJlc3Npb24KLQkJCUFzc2VydFN0YXRlbWVudCBzdGF0ZW1lbnQ9IChBc3NlcnRTdGF0ZW1lbnQpIHN0YXRlbWVudHMuZ2V0KDEpOwotCQkJCi0JCQlTaW1wbGVOYW1lIG5ld0V4cHJlc3Npb249IGFzdC5uZXdTaW1wbGVOYW1lKCJ4Iik7CQotCQkJcmV3cml0ZS5zZXQoc3RhdGVtZW50LCBBc3NlcnRTdGF0ZW1lbnQuRVhQUkVTU0lPTl9QUk9QRVJUWSwgbmV3RXhwcmVzc2lvbiwgbnVsbCk7Ci0JCX0KLQkJeyAvLyBpbnNlcnQgbWVzc2FnZQotCQkJQXNzZXJ0U3RhdGVtZW50IHN0YXRlbWVudD0gKEFzc2VydFN0YXRlbWVudCkgc3RhdGVtZW50cy5nZXQoMik7Ci0JCQkKLQkJCVNpbXBsZU5hbWUgbmV3RXhwcmVzc2lvbj0gYXN0Lm5ld1NpbXBsZU5hbWUoIngiKTsJCi0JCQlyZXdyaXRlLnNldChzdGF0ZW1lbnQsIEFzc2VydFN0YXRlbWVudC5NRVNTQUdFX1BST1BFUlRZLCBuZXdFeHByZXNzaW9uLCBudWxsKTsKLQkJfQotCQl7IC8vIHJlcGxhY2UgbWVzc2FnZQotCQkJQXNzZXJ0U3RhdGVtZW50IHN0YXRlbWVudD0gKEFzc2VydFN0YXRlbWVudCkgc3RhdGVtZW50cy5nZXQoMyk7Ci0JCQkKLQkJCVNpbXBsZU5hbWUgbmV3RXhwcmVzc2lvbj0gYXN0Lm5ld1NpbXBsZU5hbWUoIngiKTsJCi0JCQlyZXdyaXRlLnNldChzdGF0ZW1lbnQsIEFzc2VydFN0YXRlbWVudC5NRVNTQUdFX1BST1BFUlRZLCBuZXdFeHByZXNzaW9uLCBudWxsKTsKLQkJfQotCQl7IC8vIHJlbW92ZSBtZXNzYWdlCi0JCQlBc3NlcnRTdGF0ZW1lbnQgc3RhdGVtZW50PSAoQXNzZXJ0U3RhdGVtZW50KSBzdGF0ZW1lbnRzLmdldCg0KTsKLQkJCQotCQkJcmV3cml0ZS5zZXQoc3RhdGVtZW50LCBBc3NlcnRTdGF0ZW1lbnQuTUVTU0FHRV9QUk9QRVJUWSwgbnVsbCwgbnVsbCk7Ci0JCX0JCi0JCQkJCi0JCVN0cmluZyBwcmV2aWV3PSBldmFsdWF0ZVJld3JpdGUoY3UsIHJld3JpdGUpOwotCQkKLQkJYnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoInBhY2thZ2UgdGVzdDE7XG4iKTsKLQkJYnVmLmFwcGVuZCgicHVibGljIGNsYXNzIEUge1xuIik7Ci0JCWJ1Zi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBmb28oKSB7XG4iKTsKLQkJYnVmLmFwcGVuZCgiICAgICAgICBhc3NlcnQgeDtcbiIpOwotCQlidWYuYXBwZW5kKCIgICAgICAgIGFzc2VydCB4O1xuIik7Ci0JCWJ1Zi5hcHBlbmQoIiAgICAgICAgYXNzZXJ0KHRydWUpIDogeDtcbiIpOwotCQlidWYuYXBwZW5kKCIgICAgICAgIGFzc2VydCh0cnVlKSA6IHg7XG4iKTsKLQkJYnVmLmFwcGVuZCgiICAgICAgICBhc3NlcnQodHJ1ZSk7XG4iKTsKLQkJYnVmLmFwcGVuZCgiICAgIH1cbiIpOwotCQlidWYuYXBwZW5kKCJ9XG4iKTsJCi0JCWFzc2VydEVxdWFsU3RyaW5nKHByZXZpZXcsIGJ1Zi50b1N0cmluZygpKTsKLQotCX0KLQotCQogCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hTdGF0ZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJSVBhY2thZ2VGcmFnbWVudCBwYWNrMT0gdGhpcy5zb3VyY2VGb2xkZXIuY3JlYXRlUGFja2FnZUZyYWdtZW50KCJ0ZXN0MSIsIGZhbHNlLCBudWxsKTsKIAkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvQVNUUmV3cml0aW5nVHJhY2tpbmdUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdUcmFja2luZ1Rlc3QuamF2YQppbmRleCA5NWFlZGU1Li5kMzA2MzA1IDEwMDY0NAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdUcmFja2luZ1Rlc3QuamF2YQorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdUcmFja2luZ1Rlc3QuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC00OTUsMTkgKzQ5NSw5IEBACiAJCQogCQlSZXR1cm5TdGF0ZW1lbnQgcmV0dXJuU3RhdGVtZW50PSAoUmV0dXJuU3RhdGVtZW50KSBtZXRob2QuZ2V0Qm9keSgpLnN0YXRlbWVudHMoKS5nZXQoMCk7CiAJCQotCQlDYXN0RXhwcmVzc2lvbiBjYXN0RXhwcmVzc2lvbj0gYXN0Lm5ld0Nhc3RFeHByZXNzaW9uKCk7Ci0JCVR5cGUgdHlwZT0gKFR5cGUpIHJld3JpdGUuY3JlYXRlU3RyaW5nUGxhY2Vob2xkZXIoIlN0cmluZyIsIEFTVE5vZGUuU0lNUExFX1RZUEUpOwotCQlFeHByZXNzaW9uIGV4cHJlc3Npb249IChFeHByZXNzaW9uKSByZXdyaXRlLmNyZWF0ZU1vdmVUYXJnZXQocmV0dXJuU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKSk7Ci0JCWNhc3RFeHByZXNzaW9uLnNldFR5cGUodHlwZSk7Ci0JCWNhc3RFeHByZXNzaW9uLnNldEV4cHJlc3Npb24oZXhwcmVzc2lvbik7Ci0JCQotCQlyZXdyaXRlLnJlcGxhY2UocmV0dXJuU3RhdGVtZW50LmdldEV4cHJlc3Npb24oKSwgY2FzdEV4cHJlc3Npb24sIG51bGwpOwotCQkKLQkJcG9zaXRpb249IHJld3JpdGUudHJhY2sodHlwZSk7CiAJCW5hbWVzLmFkZCgiU3RyaW5nIik7CiAJCXBvc2l0aW9ucy5hZGQocG9zaXRpb24pOwogCQkKLQkJcG9zaXRpb249IHJld3JpdGUudHJhY2soZXhwcmVzc2lvbik7CiAJCW5hbWVzLmFkZCgicyIpOwogCQlwb3NpdGlvbnMuYWRkKHBvc2l0aW9uKTsKIAkJCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9BU1RSZXdyaXRpbmdUeXBlRGVjbFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ1R5cGVEZWNsVGVzdC5qYXZhCmluZGV4IGUyZWVjN2YuLmFiNmNlZDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ1R5cGVEZWNsVGVzdC5qYXZhCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0FTVFJld3JpdGluZ1R5cGVEZWNsVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTMyLDE2ICszMiwxMyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLk1vZGlmaWVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLk5hbWU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlBhcmFtZXRlcml6ZWRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlByaW1pdGl2ZVR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uU2ltcGxlTmFtZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlR5cGVQYXJhbWV0ZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS5kb20uV2lsZGNhcmRUeXBlOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUuZG9tLnJld3JpdGUuQVNUUmV3cml0ZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLmRvbS5yZXdyaXRlLkxpc3RSZXdyaXRlOwogCkBAIC01NzYsNTEgKzU3Myw2IEBACiAKIAl9CQogCQotCQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlUGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlJUGFja2FnZUZyYWdtZW50IHBhY2sxPSB0aGlzLnNvdXJjZUZvbGRlci5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoInRlc3QxIiwgZmFsc2UsIG51bGwpOwotCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoInBhY2thZ2UgdGVzdDE7XG4iKTsKLQkJYnVmLmFwcGVuZCgiY2xhc3MgRSBleHRlbmRzIEEge31cbiIpOwotCQlidWYuYXBwZW5kKCJjbGFzcyBGIHt9XG4iKTsKLQkJYnVmLmFwcGVuZCgiY2xhc3MgRyA8VD4gZXh0ZW5kcyBBIHt9XG4iKTsKLQkJYnVmLmFwcGVuZCgiY2xhc3MgSCA8VD4ge31cbiIpOwotCQlidWYuYXBwZW5kKCJjbGFzcyBJPFQ+IGV4dGVuZHMgQSB7fVxuIik7Ci0JCWJ1Zi5hcHBlbmQoImNsYXNzIEo8VD5leHRlbmRzIEEge31cbiIpOwotCQlJSmF2YVNjcmlwdFVuaXQgY3U9IHBhY2sxLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiRS5qcyIsIGJ1Zi50b1N0cmluZygpLCBmYWxzZSwgbnVsbCk7CQotCQkKLQkJSmF2YVNjcmlwdFVuaXQgYXN0Um9vdD0gY3JlYXRlQVNUMyhjdSk7Ci0JCUFTVFJld3JpdGUgcmV3cml0ZT0gQVNUUmV3cml0ZS5jcmVhdGUoYXN0Um9vdC5nZXRBU1QoKSk7Ci0JCUFTVCBhc3Q9IGFzdFJvb3QuZ2V0QVNUKCk7Ci0JCUxpc3QgdHlwZXM9IGFzdFJvb3QudHlwZXMoKTsKLQotCQlmb3IgKGludCBpPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQkvLyBhZGQgdHlwZSBwYXJhbWV0ZXIKLQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbD0gKFR5cGVEZWNsYXJhdGlvbikgdHlwZXMuZ2V0KGkpOwotCQkJTGlzdFJld3JpdGUgbGlzdFJld3JpdGU9IHJld3JpdGUuZ2V0TGlzdFJld3JpdGUodHlwZURlY2wsIFR5cGVEZWNsYXJhdGlvbi5UWVBFX1BBUkFNRVRFUlNfUFJPUEVSVFkpOwotCQkJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyPSBhc3QubmV3VHlwZVBhcmFtZXRlcigpOwotCQkJdHlwZVBhcmFtZXRlci5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJYIikpOwotCQkJbGlzdFJld3JpdGUuaW5zZXJ0Rmlyc3QodHlwZVBhcmFtZXRlciwgbnVsbCk7Ci0JCX0KLQkJZm9yIChpbnQgaT0gMjsgaSA8IDY7IGkrKykgewotCQkJLy8gcmVtb3ZlIHR5cGUgcGFyYW1ldGVyCi0JCQlUeXBlRGVjbGFyYXRpb24gdHlwZURlY2w9IChUeXBlRGVjbGFyYXRpb24pIHR5cGVzLmdldChpKTsKLQkJCXJld3JpdGUucmVtb3ZlKChBU1ROb2RlKSB0eXBlRGVjbC50eXBlUGFyYW1ldGVycygpLmdldCgwKSwgbnVsbCk7Ci0JCX0JCi0JCVN0cmluZyBwcmV2aWV3PSBldmFsdWF0ZVJld3JpdGUoY3UsIHJld3JpdGUpOwotCQkKLQkJYnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoInBhY2thZ2UgdGVzdDE7XG4iKTsKLQkJYnVmLmFwcGVuZCgiY2xhc3MgRTxYPiBleHRlbmRzIEEge31cbiIpOwotCQlidWYuYXBwZW5kKCJjbGFzcyBGPFg+IHt9XG4iKTsKLQkJYnVmLmFwcGVuZCgiY2xhc3MgRyBleHRlbmRzIEEge31cbiIpOwotCQlidWYuYXBwZW5kKCJjbGFzcyBIIHt9XG4iKTsJCi0JCWJ1Zi5hcHBlbmQoImNsYXNzIEkgZXh0ZW5kcyBBIHt9XG4iKTsKLQkJYnVmLmFwcGVuZCgiY2xhc3MgSiBleHRlbmRzIEEge31cbiIpOwotCQlhc3NlcnRFcXVhbFN0cmluZyhwcmV2aWV3LCBidWYudG9TdHJpbmcoKSk7Ci0JfQotCQotCQogCXB1YmxpYyB2b2lkIHRlc3RCdWcyMjE2MSgpIHRocm93cyBFeGNlcHRpb24gewogCS8vCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSsiOjoiICsgZ2V0TmFtZSgpICsiIGRpc2FibGVkIChidWcgMjIxNjEpIik7CiAJCkBAIC0xMTc2LDY2ICsxMTI4LDQgQEAKIAkJYXNzZXJ0RXF1YWxTdHJpbmcocHJldmlldywgYnVmLnRvU3RyaW5nKCkpOwogCiAJfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJUGFja2FnZUZyYWdtZW50IHBhY2sxPSB0aGlzLnNvdXJjZUZvbGRlci5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoInRlc3QxIiwgZmFsc2UsIG51bGwpOwotCQlTdHJpbmdCdWZmZXIgYnVmPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoInBhY2thZ2UgdGVzdDE7XG4iKTsKLQkJYnVmLmFwcGVuZCgicHVibGljIGNsYXNzIEUge1xuIik7Ci0JCWJ1Zi5hcHBlbmQoIiAgICBYPD8sID8sID8gZXh0ZW5kcyBBLCA/IHN1cGVyIEIsID8gZXh0ZW5kcyBBLCA/IHN1cGVyIEI+IHg7XG4iKTsKLQkJYnVmLmFwcGVuZCgifVxuIik7Ci0JCUlKYXZhU2NyaXB0VW5pdCBjdT0gcGFjazEuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJFLmpzIiwgYnVmLnRvU3RyaW5nKCksIGZhbHNlLCBudWxsKTsJCQkKLQotCQlKYXZhU2NyaXB0VW5pdCBhc3RSb290PSBjcmVhdGVBU1QzKGN1KTsKLQkJQVNUUmV3cml0ZSByZXdyaXRlPSBBU1RSZXdyaXRlLmNyZWF0ZShhc3RSb290LmdldEFTVCgpKTsKLQkJQVNUIGFzdD0gYXN0Um9vdC5nZXRBU1QoKTsKLQkJCi0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlPSBmaW5kVHlwZURlY2xhcmF0aW9uKGFzdFJvb3QsICJFIik7Ci0JCUZpZWxkRGVjbGFyYXRpb24gZmllbGQ9IHR5cGUuZ2V0RmllbGRzKClbMF07Ci0JCVBhcmFtZXRlcml6ZWRUeXBlIGZpZWxkVHlwZT0gKFBhcmFtZXRlcml6ZWRUeXBlKSBmaWVsZC5nZXRUeXBlKCk7Ci0JCUxpc3QgYXJncz0gZmllbGRUeXBlLnR5cGVBcmd1bWVudHMoKTsKLQkJewotCQkJV2lsZGNhcmRUeXBlIHdpbGRjYXJkVHlwZT0gKFdpbGRjYXJkVHlwZSkgYXJncy5nZXQoMCk7Ci0JCQlyZXdyaXRlLnNldCh3aWxkY2FyZFR5cGUsIFdpbGRjYXJkVHlwZS5VUFBFUl9CT1VORF9QUk9QRVJUWSwgQm9vbGVhbi5UUlVFLCBudWxsKTsKLQkJCXJld3JpdGUuc2V0KHdpbGRjYXJkVHlwZSwgV2lsZGNhcmRUeXBlLkJPVU5EX1BST1BFUlRZLCBhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3U2ltcGxlTmFtZSgiQSIpKSwgbnVsbCk7Ci0JCX0KLQkJewotCQkJV2lsZGNhcmRUeXBlIHdpbGRjYXJkVHlwZT0gKFdpbGRjYXJkVHlwZSkgYXJncy5nZXQoMSk7Ci0JCQlyZXdyaXRlLnNldCh3aWxkY2FyZFR5cGUsIFdpbGRjYXJkVHlwZS5VUFBFUl9CT1VORF9QUk9QRVJUWSwgQm9vbGVhbi5GQUxTRSwgbnVsbCk7Ci0JCQlyZXdyaXRlLnNldCh3aWxkY2FyZFR5cGUsIFdpbGRjYXJkVHlwZS5CT1VORF9QUk9QRVJUWSwgYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld1NpbXBsZU5hbWUoIkIiKSksIG51bGwpOwotCQl9Ci0JCXsKLQkJCVdpbGRjYXJkVHlwZSB3aWxkY2FyZFR5cGU9IChXaWxkY2FyZFR5cGUpIGFyZ3MuZ2V0KDIpOwotCQkJcmV3cml0ZS5zZXQod2lsZGNhcmRUeXBlLCBXaWxkY2FyZFR5cGUuVVBQRVJfQk9VTkRfUFJPUEVSVFksIEJvb2xlYW4uRkFMU0UsIG51bGwpOwotCQkJcmV3cml0ZS5zZXQod2lsZGNhcmRUeXBlLCBXaWxkY2FyZFR5cGUuQk9VTkRfUFJPUEVSVFksIGFzdC5uZXdTaW1wbGVUeXBlKGFzdC5uZXdTaW1wbGVOYW1lKCJCIikpLCBudWxsKTsKLQkJfQotCQl7Ci0JCQlXaWxkY2FyZFR5cGUgd2lsZGNhcmRUeXBlPSAoV2lsZGNhcmRUeXBlKSBhcmdzLmdldCgzKTsKLQkJCXJld3JpdGUuc2V0KHdpbGRjYXJkVHlwZSwgV2lsZGNhcmRUeXBlLlVQUEVSX0JPVU5EX1BST1BFUlRZLCBCb29sZWFuLlRSVUUsIG51bGwpOwotCQkJcmV3cml0ZS5zZXQod2lsZGNhcmRUeXBlLCBXaWxkY2FyZFR5cGUuQk9VTkRfUFJPUEVSVFksIGFzdC5uZXdTaW1wbGVUeXBlKGFzdC5uZXdTaW1wbGVOYW1lKCJBIikpLCBudWxsKTsKLQkJfQotCQl7Ci0JCQlXaWxkY2FyZFR5cGUgd2lsZGNhcmRUeXBlPSAoV2lsZGNhcmRUeXBlKSBhcmdzLmdldCg0KTsKLQkJCXJld3JpdGUuc2V0KHdpbGRjYXJkVHlwZSwgV2lsZGNhcmRUeXBlLkJPVU5EX1BST1BFUlRZLCBudWxsLCBudWxsKTsKLQkJfQotCQl7Ci0JCQlXaWxkY2FyZFR5cGUgd2lsZGNhcmRUeXBlPSAoV2lsZGNhcmRUeXBlKSBhcmdzLmdldCg1KTsKLQkJCXJld3JpdGUuc2V0KHdpbGRjYXJkVHlwZSwgV2lsZGNhcmRUeXBlLkJPVU5EX1BST1BFUlRZLCBudWxsLCBudWxsKTsKLQkJfQotCi0KLQkJU3RyaW5nIHByZXZpZXc9IGV2YWx1YXRlUmV3cml0ZShjdSwgcmV3cml0ZSk7Ci0JCQotCQlidWY9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZCgicGFja2FnZSB0ZXN0MTtcbiIpOwotCQlidWYuYXBwZW5kKCJwdWJsaWMgY2xhc3MgRSB7XG4iKTsKLQkJYnVmLmFwcGVuZCgiICAgIFg8PyBleHRlbmRzIEEsID8gc3VwZXIgQiwgPyBzdXBlciBCLCA/IGV4dGVuZHMgQSwgPywgPz4geDtcbiIpOwotCQlidWYuYXBwZW5kKCJ9XG4iKTsKLQkJYXNzZXJ0RXF1YWxTdHJpbmcocHJldmlldywgYnVmLnRvU3RyaW5nKCkpOwotCi0JfQotCi0KLQkKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0xpbmVDb21tZW50T2Zmc2V0c1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC5qc2R0LmNvcmUudGVzdHMubW9kZWwvc3JjL29yZy9lY2xpcHNlL3dzdC9qc2R0L2NvcmUvdGVzdHMvcmV3cml0ZS9kZXNjcmliaW5nL0xpbmVDb21tZW50T2Zmc2V0c1Rlc3QuamF2YQppbmRleCAwYjM2OGVhLi5iZmE2YmM1IDEwMDY0NAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3QuanNkdC5jb3JlLnRlc3RzLm1vZGVsL3NyYy9vcmcvZWNsaXBzZS93c3QvanNkdC9jb3JlL3Rlc3RzL3Jld3JpdGUvZGVzY3JpYmluZy9MaW5lQ29tbWVudE9mZnNldHNUZXN0LmphdmEKKysrIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LmpzZHQuY29yZS50ZXN0cy5tb2RlbC9zcmMvb3JnL2VjbGlwc2Uvd3N0L2pzZHQvY29yZS90ZXN0cy9yZXdyaXRlL2Rlc2NyaWJpbmcvTGluZUNvbW1lbnRPZmZzZXRzVGVzdC5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTMwMSwxMSArMzAxLDYgQEAKIAkJCiAJCWFzc2VydFRydWUoIlBhcnNlIGVycm9ycyIsIChhc3RSb290LmdldEZsYWdzKCkgJiBBU1ROb2RlLk1BTEZPUk1FRCkgPT0gMCk7CiAJCVR5cGVEZWNsYXJhdGlvbiB0eXBlPSBmaW5kVHlwZURlY2xhcmF0aW9uKGFzdFJvb3QsICJFIik7Ci0JCQotCQlMaXN0UmV3cml0ZSBsaXN0UmV3cml0ZT0gcmV3cml0ZS5nZXRMaXN0UmV3cml0ZSh0eXBlLCBUeXBlRGVjbGFyYXRpb24uVFlQRV9QQVJBTUVURVJTX1BST1BFUlRZKTsKLQkJVHlwZVBhcmFtZXRlciBuZXdUeXBlPSBhc3QubmV3VHlwZVBhcmFtZXRlcigpOwotCQluZXdUeXBlLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoIlgiKSk7Ci0JCWxpc3RSZXdyaXRlLmluc2VydExhc3QobmV3VHlwZSwgbnVsbCk7CiAJCQkKIAkJU3RyaW5nIHByZXZpZXc9IGV2YWx1YXRlUmV3cml0ZShjdSwgcmV3cml0ZSk7CiAJCQo=