LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy5zZXJ2ZXJzOwoKaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKCmltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwppbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnVUlDb25zdGFudHM7CmltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdWaWV3OwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuKjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuU2VydmVyVUlVdGlsOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5hY3Rpb25zLlNlcnZlckFjdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy50cmVlLkRpc2FibGVkTWVudU1hbmFnZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuVmlld1BhcnQ7Ci8qKgogKiBWaWV3IG9mIHNlcnZlciwgdGhlaXIgY29uZmlndXJhdGlvbnMgYW5kIHN0YXR1cy4KICovCnB1YmxpYyBjbGFzcyBTZXJ2ZXJzVmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmxhdW5jaENvbmZpZ3VyYXRpb25UeXBlcyI7CgoJcHJvdGVjdGVkIFRhYmxlIHRhYmxlOwoJcHJvdGVjdGVkIFNlcnZlclRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwoKCS8vIGFjdGlvbnMgb24gYSBzZXJ2ZXIKCXByb3RlY3RlZCBBY3Rpb25bXSBhY3Rpb25zOwoJcHJvdGVjdGVkIE1lbnVNYW5hZ2VyIHJlc3RhcnRNZW51OwoKCS8qKgoJICogU2VydmVyc1ZpZXcgY29uc3RydWN0b3IgY29tbWVudC4KCSAqLwoJcHVibGljIFNlcnZlcnNWaWV3KCkgewoJCXN1cGVyKCk7Cgl9CgkKCS8qKgoJICogY3JlYXRlUGFydENvbnRyb2wgbWV0aG9kIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKCQl0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuTk9ORSk7CgkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwoJCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwoJCXRhYmxlLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7CgkJV29ya2JlbmNoSGVscC5zZXRIZWxwKHRhYmxlLCBDb250ZXh0SWRzLlZJRVdfQ09OVFJPTCk7CgkJCgkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKCQoJCS8vIGFkZCBjb2x1bW5zCgkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuU0lOR0xFKTsKCQljb2x1bW4uc2V0VGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJXZpZXdTZXJ2ZXIiKSk7CgkJQ29sdW1uV2VpZ2h0RGF0YSBjb2xEYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMjAwLCAyMDAsIHRydWUpOwoJCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7CgkJCgkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuU0lOR0xFKTsKCQljb2x1bW4uc2V0VGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJXZpZXdIb3N0IikpOwoJCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDAsIDE1MCwgdHJ1ZSk7CgkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2xEYXRhKTsKCQoJCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULlNJTkdMRSk7CgkJY29sdW1uLnNldFRleHQoU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV2aWV3U3RhdHVzIikpOwoJCWNvbERhdGEgPSBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxMDAsIDE1MCwgdHJ1ZSk7CgkJdGFibGVMYXlvdXQuYWRkQ29sdW1uRGF0YShjb2xEYXRhKTsKCQoJCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULlNJTkdMRSk7CgkJY29sdW1uLnNldFRleHQoU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV2aWV3U3luYyIpKTsKCQljb2xEYXRhID0gbmV3IENvbHVtbldlaWdodERhdGEoMTAwLCAxNTAsIHRydWUpOwoJCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEoY29sRGF0YSk7CgkJCgkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKCQoJCXRhYmxlVmlld2VyID0gbmV3IFNlcnZlclRhYmxlVmlld2VyKHRoaXMsIHRhYmxlKTsKCQlpbml0aWFsaXplQWN0aW9ucyh0YWJsZVZpZXdlcik7CgkKCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKCQkJCXRyeSB7CgkJCQkJLypUYWJsZUl0ZW0gaXRlbSA9IHRhYmxlLmdldFNlbGVjdGlvbigpWzBdOwoJCQkJCUlTZXJ2ZXJSZXNvdXJjZSByZXNvdXJjZSA9IChJU2VydmVyUmVzb3VyY2UpIGl0ZW0uZ2V0RGF0YSgpOwoJCQkJCUlTZXJ2ZXJSZXNvdXJjZUZhY3RvcnkgZmFjdG9yeSA9IFNlcnZlclV0aWwuZ2V0U2VydmVyUmVzb3VyY2VGYWN0b3J5KHJlc291cmNlKTsKCQkJCQlTdHJpbmcgbGFiZWwgPSBTZXJ2ZXJMYWJlbFByb3ZpZGVyLmdldEluc3RhbmNlKCkuZ2V0VGV4dChmYWN0b3J5KTsKCQkJCQlsYWJlbCArPSAiICgiOwoJCQkJCWxhYmVsICs9IFNlcnZlckNvcmUuZ2V0UmVzb3VyY2VNYW5hZ2VyKCkuZ2V0U2VydmVyUmVzb3VyY2VMb2NhdGlvbihyZXNvdXJjZSkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLnN1YnN0cmluZygxKTsKCQkJCQlsYWJlbCArPSAiKSI7CgkJCQkJZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5zZXRNZXNzYWdlKFNlcnZlckxhYmVsUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShmYWN0b3J5KSwgbGFiZWwpOwoJCQkJCQoJCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKCQkJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgcmVzb3VyY2U7CgkJCQkJCUlMYXVuY2hNYW5hZ2VyIGxhdW5jaE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwoJCQkJCQlJTGF1bmNoW10gbGF1bmNoZXMgPSBsYXVuY2hNYW5hZ2VyLmdldExhdW5jaGVzKCk7CgkJCQkJCWludCBzaXplID0gbGF1bmNoZXMubGVuZ3RoOwoJCQkJCQlmb3IgKGludCBpID0gc2l6ZS0xOyBpID49IDA7IGktLSkgewoJCQkJCQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gbGF1bmNoZXNbaV0uZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigpOwoJCQkJCQkJaWYgKExBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEVfSUQuZXF1YWxzKGNvbmZpZy5nZXRUeXBlKCkuZ2V0SWRlbnRpZmllcigpKSAmJgoJCQkJCQkJCQlTZXJ2ZXJDb3JlLmdldFNlcnZlclJlZihzZXJ2ZXIpLmVxdWFscyhjb25maWcuZ2V0QXR0cmlidXRlKFNFUlZFUl9SRUYsIChTdHJpbmcpbnVsbCkpKSB7CgkJCQkJCQkJc2VsZWN0U2VydmVyUHJvY2VzcyhsYXVuY2hlc1tpXSk7CgkJCQkJCQkJcmV0dXJuOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfSovCgkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJCWdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkuc2V0TWVzc2FnZShudWxsLCAiIik7CgkJCQl9CgkJCX0KCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7CgkJCQl0cnkgewoJCQkJCVRhYmxlSXRlbSBpdGVtID0gdGFibGUuZ2V0U2VsZWN0aW9uKClbMF07CgkJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgaXRlbS5nZXREYXRhKCk7CgkJCQkJU2VydmVyVUlVdGlsLmVkaXRTZXJ2ZXIoc2VydmVyKTsKCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IG9wZW4gc2VydmVyIiwgZSk7CgkJCQl9CgkJCX0KCQl9KTsKCQkKCQlNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcigiI1BvcHVwTWVudSIpOwoJCW1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKCQlmaW5hbCBTaGVsbCBzaGVsbCA9IHRhYmxlLmdldFNoZWxsKCk7CgkJbWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewoJCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1ncikgewoJCQkJZmlsbENvbnRleHRNZW51KHNoZWxsLCBtZ3IpOwoJCQl9CgkJfSk7CgkJTWVudSBtZW51ID0gbWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUocGFyZW50KTsKCQl0YWJsZS5zZXRNZW51KG1lbnUpOwoJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KG1lbnVNYW5hZ2VyLCB0YWJsZVZpZXdlcik7Cgl9CgoJcHJvdGVjdGVkIHZvaWQgc2VsZWN0U2VydmVyUHJvY2VzcyhPYmplY3QgcHJvY2VzcykgewoJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSA7CgkJaWYgKHdpbmRvdyAhPSBudWxsKSB7CgkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwoJCQlpZiAocGFnZSAhPSBudWxsKSB7CgkJCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFnZS5maW5kVmlldyhJRGVidWdVSUNvbnN0YW50cy5JRF9ERUJVR19WSUVXKTsKCQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKCQkJCQlJRGVidWdWaWV3IHZpZXcgPSAoSURlYnVnVmlldylwYXJ0LmdldEFkYXB0ZXIoSURlYnVnVmlldy5jbGFzcyk7CgkJCQkJaWYgKHZpZXcgIT0gbnVsbCkgewoJCQkJCQlWaWV3ZXIgdmlld2VyID0gdmlldy5nZXRWaWV3ZXIoKTsKCQkJCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7CgkJCQkJCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHByb2Nlc3MpKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCQoJLyoqCgkgKiBJbml0aWFsaXplIGFjdGlvbnMKCSAqLwoJcHVibGljIHZvaWQgaW5pdGlhbGl6ZUFjdGlvbnMoSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7CgkJU2hlbGwgc2hlbGwgPSBnZXRTaXRlKCkuZ2V0U2hlbGwoKTsKCgkJLy8gY3JlYXRlIHRoZSBkZWJ1ZyBhY3Rpb24KCQlBY3Rpb24gZGVidWdBY3Rpb24gPSBuZXcgU3RhcnRBY3Rpb24oc2hlbGwsIHByb3ZpZGVyLCAiZGVidWciLCBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFKTsKCQlkZWJ1Z0FjdGlvbi5zZXRUb29sVGlwVGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWFjdGlvbkRlYnVnVG9vbFRpcCIpKTsKCQlkZWJ1Z0FjdGlvbi5zZXRUZXh0KFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlYWN0aW9uRGVidWciKSk7CgkJZGVidWdBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfU1RBUlRfREVCVUcpKTsKCQlkZWJ1Z0FjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX1NUQVJUX0RFQlVHKSk7CgkJZGVidWdBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9TVEFSVF9ERUJVRykpOwoJCgkJLy8gY3JlYXRlIHRoZSBzdGFydCBhY3Rpb24KCQlBY3Rpb24gcnVuQWN0aW9uID0gbmV3IFN0YXJ0QWN0aW9uKHNoZWxsLCBwcm92aWRlciwgInN0YXJ0IiwgSUxhdW5jaE1hbmFnZXIuUlVOX01PREUpOwoJCXJ1bkFjdGlvbi5zZXRUb29sVGlwVGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWFjdGlvblN0YXJ0VG9vbFRpcCIpKTsKCQlydW5BY3Rpb24uc2V0VGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWFjdGlvblN0YXJ0IikpOwoJCXJ1bkFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9TVEFSVCkpOwoJCXJ1bkFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX1NUQVJUKSk7CgkJcnVuQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfU1RBUlQpKTsKCQkKCQkvLyBjcmVhdGUgdGhlIHByb2ZpbGUgYWN0aW9uCgkJQWN0aW9uIHByb2ZpbGVBY3Rpb24gPSBuZXcgU3RhcnRBY3Rpb24oc2hlbGwsIHByb3ZpZGVyLCAicHJvZmlsZSIsIElMYXVuY2hNYW5hZ2VyLlBST0ZJTEVfTU9ERSk7CgkJcHJvZmlsZUFjdGlvbi5zZXRUb29sVGlwVGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWFjdGlvblByb2ZpbGVUb29sVGlwIikpOwoJCXByb2ZpbGVBY3Rpb24uc2V0VGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWFjdGlvblByb2ZpbGUiKSk7CgkJcHJvZmlsZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9TVEFSVF9QUk9GSUxFKSk7CgkJcHJvZmlsZUFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX1NUQVJUX1BST0ZJTEUpKTsKCQlwcm9maWxlQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfU1RBUlRfUFJPRklMRSkpOwoJCgkJLy8gY3JlYXRlIHRoZSByZXN0YXJ0IG1lbnUKCQlyZXN0YXJ0TWVudSA9IG5ldyBNZW51TWFuYWdlcihTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWFjdGlvblJlc3RhcnQiKSk7CgkJCgkJQWN0aW9uIHJlc3RhcnRBY3Rpb24gPSBuZXcgUmVzdGFydEFjdGlvbihzaGVsbCwgcHJvdmlkZXIsICJyZXN0YXJ0RGVidWciLCBJTGF1bmNoTWFuYWdlci5ERUJVR19NT0RFKTsKCQlyZXN0YXJ0QWN0aW9uLnNldFRvb2xUaXBUZXh0KFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlYWN0aW9uRGVidWdUb29sVGlwIikpOwoJCXJlc3RhcnRBY3Rpb24uc2V0VGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWFjdGlvbkRlYnVnIikpOwoJCXJlc3RhcnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfU1RBUlRfREVCVUcpKTsKCQlyZXN0YXJ0QWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfU1RBUlRfREVCVUcpKTsKCQlyZXN0YXJ0QWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfU1RBUlRfREVCVUcpKTsKCQlyZXN0YXJ0TWVudS5hZGQocmVzdGFydEFjdGlvbik7CgkJCgkJcmVzdGFydEFjdGlvbiA9IG5ldyBSZXN0YXJ0QWN0aW9uKHNoZWxsLCBwcm92aWRlciwgInJlc3RhcnRSdW4iLCBJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSk7CgkJcmVzdGFydEFjdGlvbi5zZXRUb29sVGlwVGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWFjdGlvblJlc3RhcnRUb29sVGlwIikpOwoJCXJlc3RhcnRBY3Rpb24uc2V0VGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWFjdGlvblN0YXJ0IikpOwoJCXJlc3RhcnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfU1RBUlQpKTsKCQlyZXN0YXJ0QWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfU1RBUlQpKTsKCQlyZXN0YXJ0QWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfU1RBUlQpKTsKCQlyZXN0YXJ0TWVudS5hZGQocmVzdGFydEFjdGlvbik7CgkJCgkJcmVzdGFydEFjdGlvbiA9IG5ldyBSZXN0YXJ0QWN0aW9uKHNoZWxsLCBwcm92aWRlciwgInJlc3RhcnRQcm9maWxlIiwgSUxhdW5jaE1hbmFnZXIuUFJPRklMRV9NT0RFKTsKCQlyZXN0YXJ0QWN0aW9uLnNldFRvb2xUaXBUZXh0KFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlYWN0aW9uUmVzdGFydFRvb2xUaXAiKSk7CgkJcmVzdGFydEFjdGlvbi5zZXRUZXh0KFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlYWN0aW9uUHJvZmlsZSIpKTsKCQlyZXN0YXJ0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1NUQVJUX1BST0ZJTEUpKTsKCQlyZXN0YXJ0QWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfU1RBUlRfUFJPRklMRSkpOwoJCXJlc3RhcnRBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9TVEFSVF9QUk9GSUxFKSk7CgkJcmVzdGFydE1lbnUuYWRkKHJlc3RhcnRBY3Rpb24pOwoJCQoJCS8vIGNyZWF0ZSB0aGUgcmVzdGFydCBhY3Rpb24KCQlyZXN0YXJ0QWN0aW9uID0gbmV3IFJlc3RhcnRBY3Rpb24oc2hlbGwsIHByb3ZpZGVyLCAicmVzdGFydCIpOwoJCXJlc3RhcnRBY3Rpb24uc2V0VG9vbFRpcFRleHQoU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVhY3Rpb25SZXN0YXJ0VG9vbFRpcCIpKTsKCQlyZXN0YXJ0QWN0aW9uLnNldFRleHQoU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVhY3Rpb25SZXN0YXJ0IikpOwoJCXJlc3RhcnRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VMQ0xfUkVTVEFSVCkpOwoJCXJlc3RhcnRBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfQ0xDTF9SRVNUQVJUKSk7CgkJcmVzdGFydEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19ETENMX1JFU1RBUlQpKTsKCgkJLy8gY3JlYXRlIHRoZSBzdG9wIGFjdGlvbgoJCUFjdGlvbiBzdG9wQWN0aW9uID0gbmV3IFN0b3BBY3Rpb24oc2hlbGwsIHByb3ZpZGVyLCAic3RvcCIsIElTZXJ2ZXJUeXBlLlNFUlZFUl9TVEFURV9TRVRfTUFOQUdFRCk7CgkJc3RvcEFjdGlvbi5zZXRUb29sVGlwVGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWFjdGlvblN0b3BUb29sVGlwIikpOwoJCXN0b3BBY3Rpb24uc2V0VGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWFjdGlvblN0b3AiKSk7CgkJc3RvcEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRUxDTF9TVE9QKSk7CgkJc3RvcEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19DTENMX1NUT1ApKTsKCQlzdG9wQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RMQ0xfU1RPUCkpOwoKCQkvLyBjcmVhdGUgdGhlIGRpc2Nvbm5lY3QgYWN0aW9uCgkJQWN0aW9uIGRpc2Nvbm5lY3RBY3Rpb24gPSBuZXcgU3RvcEFjdGlvbihzaGVsbCwgcHJvdmlkZXIsICJkaXNjb25uZWN0IiwgSVNlcnZlclR5cGUuU0VSVkVSX1NUQVRFX1NFVF9BVFRBQ0hFRCk7CgkJZGlzY29ubmVjdEFjdGlvbi5zZXRUb29sVGlwVGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWFjdGlvblN0b3BUb29sVGlwMiIpKTsKCQlkaXNjb25uZWN0QWN0aW9uLnNldFRleHQoU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVhY3Rpb25TdG9wMiIpKTsKCQlkaXNjb25uZWN0QWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX0RJU0NPTk5FQ1QpKTsKCQlkaXNjb25uZWN0QWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfRElTQ09OTkVDVCkpOwoJCWRpc2Nvbm5lY3RBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9ESVNDT05ORUNUKSk7CgoJCS8vIGNyZWF0ZSB0aGUgcHVibGlzaCBhY3Rpb24KCQlBY3Rpb24gcHVibGlzaEFjdGlvbiA9IG5ldyBQdWJsaXNoQWN0aW9uKHNoZWxsLCBwcm92aWRlciwgInB1Ymxpc2giKTsKCQlwdWJsaXNoQWN0aW9uLnNldFRvb2xUaXBUZXh0KFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlYWN0aW9uUHVibGlzaFRvb2xUaXAiKSk7CgkJcHVibGlzaEFjdGlvbi5zZXRUZXh0KFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlYWN0aW9uUHVibGlzaCIpKTsKCQlwdWJsaXNoQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihJbWFnZVJlc291cmNlLklNR19FTENMX1BVQkxJU0gpKTsKCQlwdWJsaXNoQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NMQ0xfUFVCTElTSCkpOwoJCXB1Ymxpc2hBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoSW1hZ2VSZXNvdXJjZS5JTUdfRExDTF9QVUJMSVNIKSk7CgkJCgkJLy8gY3JlYXRlIHRoZSBtb2R1bGUgc2xvc2ggZGlhbG9nIGFjdGlvbgoJCUFjdGlvbiBhZGRNb2R1bGVBY3Rpb24gPSBuZXcgTW9kdWxlU2xvc2hBY3Rpb24oc2hlbGwsIHByb3ZpZGVyLCAibW9kdWxlcyIpOwoJCWFkZE1vZHVsZUFjdGlvbi5zZXRUb29sVGlwVGV4dChTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWFjdGlvbk1vZGlmeU1vZHVsZXNUb29sVGlwIikpOwoJCWFkZE1vZHVsZUFjdGlvbi5zZXRUZXh0KFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlYWN0aW9uTW9kaWZ5TW9kdWxlcyIpKTsKCQlhZGRNb2R1bGVBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0VUT09MX01PRElGWV9NT0RVTEVTKSk7CgkJYWRkTW9kdWxlQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0NUT09MX01PRElGWV9NT0RVTEVTKSk7CgkJYWRkTW9kdWxlQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlUmVzb3VyY2UuSU1HX0RUT09MX01PRElGWV9NT0RVTEVTKSk7CgkJCgkJYWN0aW9ucyA9IG5ldyBBY3Rpb25bOF07CgkJYWN0aW9uc1swXSA9IGRlYnVnQWN0aW9uOwoJCWFjdGlvbnNbMV0gPSBydW5BY3Rpb247CgkJYWN0aW9uc1syXSA9IHByb2ZpbGVBY3Rpb247CgkJYWN0aW9uc1szXSA9IHJlc3RhcnRBY3Rpb247CgkJYWN0aW9uc1s0XSA9IHN0b3BBY3Rpb247CgkJYWN0aW9uc1s1XSA9IGRpc2Nvbm5lY3RBY3Rpb247CgkJYWN0aW9uc1s2XSA9IHB1Ymxpc2hBY3Rpb247CgkJYWN0aW9uc1s3XSA9IGFkZE1vZHVsZUFjdGlvbjsKCQkKCQkvLyBhZGQgdG9vbGJhciBidXR0b25zCgkJSUNvbnRyaWJ1dGlvbk1hbmFnZXIgY20gPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRUb29sQmFyTWFuYWdlcigpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGggLSAxOyBpKyspIHsKCQkJY20uYWRkKGFjdGlvbnNbaV0pOwoJCX0KCX0KCQoJcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KFNoZWxsIHNoZWxsLCBJTWVudU1hbmFnZXIgbWVudSkgewoJCS8vIGdldCBzZWxlY3Rpb24gYnV0IGF2b2lkIG5vIHNlbGVjdGlvbiBvciBtdWx0aXBsZSBzZWxlY3Rpb24KCQlJU2VydmVyIHNlcnZlciA9IG51bGw7CgkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKCQlpZiAoIXNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsKCQkJc2VydmVyID0gKElTZXJ2ZXIpIGl0ZXJhdG9yLm5leHQoKTsKCQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkKCQkJCXNlcnZlciA9IG51bGw7CgkJfQoJCQoJCS8vIG5ldyBhY3Rpb24KCQlNZW51TWFuYWdlciBuZXdNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlYWN0aW9uTmV3IikpOwoJCVNlcnZlclRyZWUuZmlsbE5ld0NvbnRleHRNZW51KG51bGwsIHNlbGVjdGlvbiwgbmV3TWVudSk7CgkJbWVudS5hZGQobmV3TWVudSk7CgkJCgkJLy8gb3BlbiBhY3Rpb24KCQlpZiAoc2VydmVyICE9IG51bGwpIHsKCQkJbWVudS5hZGQobmV3IE9wZW5BY3Rpb24oc2VydmVyKSk7CgkJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CgkJCQoJCQltZW51LmFkZChuZXcgRGVsZXRlQWN0aW9uKHNoZWxsLCBzZXJ2ZXIpKTsKCQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKCQkKCQkJLy8gc2VydmVyIGFjdGlvbnMKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25zLmxlbmd0aCAtIDE7IGkrKykgewoJCQkJaWYgKGkgPT0gMykKCQkJCQltZW51LmFkZChyZXN0YXJ0TWVudSk7CgkJCQllbHNlCgkJCQkJbWVudS5hZGQoYWN0aW9uc1tpXSk7CgkJCX0KCQkKCQkJLy8gc3dpdGNoIGNvbmZpZwoJCQkvKmlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpICE9IG51bGwgJiYgc2VydmVyLmdldFNlcnZlclR5cGUoKS5oYXNTZXJ2ZXJDb25maWd1cmF0aW9uKCkpIHsKCQkJCU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlYWN0aW9uU3dpdGNoQ29uZmlndXJhdGlvbiIpKTsKCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgU3dpdGNoQ29uZmlndXJhdGlvbkFjdGlvbihzaGVsbCwgU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiV2aWV3Tm9Db25maWd1cmF0aW9uIiksIHNlcnZlciwgbnVsbCkpOwoJCgkJCQlJU2VydmVyQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBnZXRTdXBwb3J0ZWRTZXJ2ZXJDb25maWd1cmF0aW9ucyhzZXJ2ZXIpOwoJCQkJaWYgKGNvbmZpZ3MgIT0gbnVsbCkgewoJCQkJCWludCBzaXplID0gY29uZmlncy5sZW5ndGg7CgkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBTd2l0Y2hDb25maWd1cmF0aW9uQWN0aW9uKHNoZWxsLCBjb25maWdzW2ldLmdldE5hbWUoKSwgc2VydmVyLCBjb25maWdzW2ldKSk7CgkJCQkJfQoJCQkJfQoJCgkJCQltZW51LmFkZChtZW51TWFuYWdlcik7CgkJCX0qLwoJCQkKCQkJLy8gbW9uaXRvcgoJCQlpZiAoc2VydmVyLmdldFNlcnZlclR5cGUoKSAhPSBudWxsKSB7CgkJCQlmaW5hbCBNZW51TWFuYWdlciBtZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWFjdGlvbk1vbml0b3IiKSk7CgkJCQkKCQkJCWZpbmFsIElTZXJ2ZXIgc2VydmVyMiA9IHNlcnZlcjsKCQkJCWZpbmFsIFNoZWxsIHNoZWxsMiA9IHNoZWxsOwoJCQkJbWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKG5ldyBJTWVudUxpc3RlbmVyKCkgewoJCQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewoJCQkJCQltZW51TWFuYWdlci5yZW1vdmVBbGwoKTsKCQkJCQkJaWYgKHNlcnZlcjIuaXNEZWxlZ2F0ZVBsdWdpbkFjdGl2YXRlZCgpKSB7CgkJCQkJCQlJU2VydmVyUG9ydFtdIHBvcnRzID0gc2VydmVyMi5nZXRTZXJ2ZXJQb3J0cygpOwoJCQkJCQkJaWYgKHBvcnRzICE9IG51bGwpIHsKCQkJCQkJCQlpbnQgc2l6ZSA9IHBvcnRzLmxlbmd0aDsKCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJCQkJCQlpZiAoIXBvcnRzW2ldLmlzQWR2YW5jZWQoKSkKCQkJCQkJCQkJCW1lbnVNYW5hZ2VyLmFkZChuZXcgTW9uaXRvclNlcnZlclBvcnRBY3Rpb24oc2hlbGwyLCBzZXJ2ZXIyLCBwb3J0c1tpXSkpOwoJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQkKCQkJCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBNb25pdG9yU2VydmVyQWN0aW9uKHNoZWxsMiwgc2VydmVyMikpOwoJCQkJCX0KCQkJCX0pOwoJCQkJCgkJCQkvLyBhZGQgYW4gaW5pdGlhbCBtZW51IGl0ZW0gc28gdGhhdCB0aGUgbWVudSBhcHBlYXJzIGNvcnJlY3RseQoJCQkJbWVudU1hbmFnZXIuYWRkKG5ldyBNb25pdG9yU2VydmVyQWN0aW9uKHNoZWxsLCBzZXJ2ZXIpKTsKCQkJCW1lbnUuYWRkKG1lbnVNYW5hZ2VyKTsKCQkJfQoJCX0KCQoJCWlmIChzZXJ2ZXIgIT0gbnVsbCAmJiBzZXJ2ZXIuaXNEZWxlZ2F0ZUxvYWRlZCgpKSB7CgkJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7CgkKCQkJTWVudU1hbmFnZXIgcmVzdGFydFByb2plY3RNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlYWN0aW9uUmVzdGFydFByb2plY3QiKSk7CgkKCQkJaWYgKHNlcnZlciAhPSBudWxsKSB7CgkJCQlJTW9kdWxlW10gbW9kdWxlcyA9IFNlcnZlclV0aWwuZ2V0QWxsQ29udGFpbmVkTW9kdWxlcyhzZXJ2ZXIsIG51bGwpOwoJCQkJaWYgKG1vZHVsZXMgIT0gbnVsbCkgewoJCQkJCWludCBzaXplID0gbW9kdWxlcy5sZW5ndGg7CgkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBSZXN0YXJ0TW9kdWxlQWN0aW9uKHNlcnZlciwgbW9kdWxlc1tpXSk7CgkJCQkJCXJlc3RhcnRQcm9qZWN0TWVudS5hZGQoYWN0aW9uKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQkJaWYgKHJlc3RhcnRQcm9qZWN0TWVudS5pc0VtcHR5KCkpCgkJCQltZW51LmFkZChuZXcgRGlzYWJsZWRNZW51TWFuYWdlcihTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJWFjdGlvblJlc3RhcnRQcm9qZWN0IikpKTsKCQkJZWxzZQoJCQkJbWVudS5hZGQocmVzdGFydFByb2plY3RNZW51KTsKCQl9CgkJCgkJaWYgKHNlcnZlciAhPSBudWxsKSB7CgkJCVNlcnZlckFjdGlvbi5hZGRTZXJ2ZXJNZW51SXRlbXMoc2hlbGwsIG1lbnUsIHNlcnZlcik7CgkJfQoJCgkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUykpOwoJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMrIi1lbmQiKSk7Cgl9CgkKCS8qKgoJICogUmV0dXJucyBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbnMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMKCSAqIHNlcnZlci4KCSAqCgkgKiBAcGFyYW0gc2VydmVyIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JU2VydmVyCgkgKiBAcmV0dXJuIGphdmEudXRpbC5MaXN0CgkgKi8KCS8qcHJvdGVjdGVkIHN0YXRpYyBJU2VydmVyQ29uZmlndXJhdGlvbltdIGdldFN1cHBvcnRlZFNlcnZlckNvbmZpZ3VyYXRpb25zKElTZXJ2ZXIgc2VydmVyKSB7CgkJaWYgKHNlcnZlciA9PSBudWxsKQoJCQlyZXR1cm4gbmV3IElTZXJ2ZXJDb25maWd1cmF0aW9uWzBdOwoJCgkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwoJCgkJSVNlcnZlckNvbmZpZ3VyYXRpb25bXSBjb25maWdzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJDb25maWd1cmF0aW9ucygpOwoJCWlmIChjb25maWdzICE9IG51bGwpIHsKCQkJaW50IHNpemUgPSBjb25maWdzLmxlbmd0aDsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCS8vVHJhY2UudHJhY2UoIklzIHN1cHBvcnRlZCBjb25maWd1cmF0aW9uOiAiICsgZ2V0TmFtZShzZXJ2ZXIpICsgIiAiICsgZ2V0TmFtZShjb25maWd1cmF0aW9uKSArICIgIiArIHNlcnZlci5pc1N1cHBvcnRlZENvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikpOwoJCQkJaWYgKHNlcnZlci5pc1N1cHBvcnRlZENvbmZpZ3VyYXRpb24oY29uZmlnc1tpXSkpCgkJCQkJbGlzdC5hZGQoY29uZmlnc1tpXSk7CgkJCX0KCQl9CgkJCgkJSVNlcnZlckNvbmZpZ3VyYXRpb25bXSBzYyA9IG5ldyBJU2VydmVyQ29uZmlndXJhdGlvbltsaXN0LnNpemUoKV07CgkJbGlzdC50b0FycmF5KHNjKTsKCQlyZXR1cm4gc2M7Cgl9Ki8KCQoJLyoqCgkgKiAKCSAqLwoJcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7CgkJaWYgKHRhYmxlICE9IG51bGwpCgkJCXRhYmxlLnNldEZvY3VzKCk7Cgl9Cn0=